DI_ICON1);
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS,RGB(208,208,208));
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
SetColor函数和OffsetColor函数的第一个参数表示按钮的各个状态,前景色就是文字的颜色,它们的取值表示:
BTNST_COLOR_BK_IN; //鼠标放在按钮内时的背景色
BTNST_COLOR_FG_IN; //鼠标放在按钮内时的前景色
BTNST_COLOR_BK_OUT; //普通状态时的背景色
BTNST_COLOR_FG_OUT; //普通状态时的前景色
BTNST_COLOR_BK_FOCUS; //按钮被按下后的背景色
BTNST_COLOR_FG_FOCUS; //按钮被按下后的前景色实例:演示程序中的48×48 icon 按钮、Zip按钮等。
(5)设置图标和文字的位置;
假设按钮ID为IDC_BUTTON1;
①添加成员变量 CButtonST m_btn;
②添加Icon资源,ID设为IDI_ICON1;
③在OnInitDialog函数中初始化按钮;
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
SetAlign函数的第一个参数表示位置信息,缺省情况下,文字在图标右边ST_ALIGN_HORIZ; // 文字在右
ST_ALIGN_VERT; //文字在下
ST_ALIGN_HORIZ_RIGHT; // 文字在左
(6)根据Icon的形状设置按钮的形状;
假设按钮ID为IDC_BUTTON1;
①添加成员变量 CButtonST m_btn;
②添加Icon资源,设其ID设为IDI_ICON1;
③在OnInitDialog函数中初始化按钮;
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.DrawBorder(FALSE);
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_IN, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
为达到最好效果,请根据Icon的大小调整按钮的大小。并根据实际情况设置背景颜色,请事先将按钮的文字去掉。
第四章 串口通讯
4.1 PC机与单片机通信方式
PC机与单片机通讯通常采用两种方式:并行通信和串行通信。并行通信是指代发送的数据各位同时传送,串行通信则是数据一位一位的按顺序传送。并行通信虽然传输效率高,由于所需硬件设计复杂,不适于长距离通信,所以一般只适用于要求实时性强。传送速率较高的测控系统中,实用面较窄;相比之下,串行通信简单易实现,传输距离较长,所以已被广泛应用于各种工控系统中[2]。
串行通行分为同步通行和异步通信2种方式。同步通信是指通过在每个数据块开始时的同步字符来实现收/发双方同步的一种数据传送方法,常用于信息量大,速度要求高的场合;异步通信则规定了标准的字符数据传输格式,即每一帧信息由起始位、数据位、奇偶校验位和停止位组成[3]。由于有冗余位,所以传送效率不高,常用于信息量不大,速度较低的场合。在计算机测控系统中,由于串行接口的标准化,一般采用异步串行通信方式,以提高其通用性。
PC机与下位机通讯采用标准通讯端口RS-232。目前RS-232是PC机与通信工业中应用最广泛的一种串行接口,而对于单片机与PC机的串行通信,可以进一步简化接法,只需要三根线:RxD (接收)、TxD(发送)、GND(信号地,收发双方信号共地,即信号地线接在一起),这种接法俗称'零Modem接法"。RS-232传送的是单端信号,即取RxD及TxD对GND的电压值为信号电平,电压+5V-+15V表示逻辑0,电压-15V--5V表示逻辑1,称之为EIA电平。而单片机一般采用TTl和COMS兼容电平,所以进行机与单片机的串行通信时,要进行EIA电平与TTL电平之间的转换。实施起来很简单,只要在机串口和单片机串口之间再接上一个电平转换芯片就可以了[12]。可使用相应的专用芯片进行电平转化,如MAX232[11]。如图4.1
图4.1PC机与单片机连接图
RS-232C是美国电子工业协会(EIA)于1962年制定并于1968年最后一次修改而成的一种串行通信标准,它既是一个物理接口标准,也是一个电气标准。RS-232C接口采用25根线,实际使用时,除去接到设备外壳的一根安全地线以外,真正用于异步串行通信的只有9根线(其余空着没定义),也正是因为如此,PC机一般都具有一个或几个针RS-232C串行接口,分别称为 COM1 和 COM2。
(1)由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:
①接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接。
②传输速率较低,在异步传输时,波特率为20Kbps;因此在"南方的老树51CPLD开发板"中,综合程序波特率只能采用19200,也是这个原因。
③接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
④传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右[10]。
(2)针对RS232接口的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点:
①RS-485的电气特性:逻辑"1"以两线间的电压差为+(2-6) V表示;逻辑"0"以两线间的电压差为-(2-6)V表示。接口信号电平比RS-232降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL 电路连接。
② RS-485的数据最高传输速率为10Mbps 。
③RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
④ RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS-232接口在总线上只允许连接1个收发器, 即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口建立设备网络[6]。
4.2 VC实现串口通讯的四种方式
4.2.1 基于Windows API通信函数
与通信有关的Windows API函数共有26个,但主要有关的有CreateFile() 用 "comn"(n为串口号)作为文件名就可以打开串口;ReadFile() 读串口;WriteFile() 写串口;CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似,以下给出API实现的源代码。
(1)发送例程
声明全局变HANDLE m_hIDComDev;OVERLAPPED m_OverlappedRead;
void CSerialAPIView::OnSend() //发送数据
{
char szMessage[20] = "data";
DWORD dwBytesWritten;
for (int i=0; i<sizeof(szMessage); i++)
{
WriteFile(m_hIDComDev,(LPSTR)&szMessage[i],1,&dwBytesWritten,&m_OverlappedWrite);
if (WaitForSingleObject(m_OverlapperWrite, hEvent, 1000))dwBytesWritten = 0;
else
{
GentOverlappedResult(m_hIDComDev,&m_OverlappedWrite,&dwBytesWritten, FALSE);
m_OverlappedWrite. Offset += dwBytesWritten;
}
dwBytesWritten++;
}
(2)接收例程
DCB ComDcb; //设备控制块
HANDLE hCom;
hCom = CreateFile ("COM1",GENERIC_READ| GENERIC_WRITE,0,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hCom==INVALID_HANDLE_VALUE)
{ AfxMessageBox("无法打开串行口"); }
else
{
COMMTIMEOUTS CommTimeOuts ;
SetCommMask(hCom, EV_RXCHAR ) ;
SetupComm(hCom, 4096, 4096 ) ; //设置收发缓冲区尺寸为4K
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT | PUR
上一篇:
酒店预订系统设计与实现毕业论文(2003doc)