人机界面提供的串口是符合通用标准的。WinCE.net下的串口通讯与Windows下的串口通讯原理相同。都是应用程序不直接控制硬件,而是通过操作系统提供的设备驱动程序,来进行数据传递。
WinCE.net是Win32编程。串口在Win32中是作为文件来进行处理的,不是直接对端口进行操作。对于串行通信,Win32提供了相应的文件I/O函数与通信函数。
但是也要注意WinCE.net所能支持的API函数只是WindowAPI函数的子集。Windows有的,WinCE.net下不一定能使用。同时,WinCE.net字符集类似于WindowsNT而不同于Windows9x,它是基于Unicode的。这也是开发程序过程中从WINDOWS转到WinCE.net的程序员遇到问题最多的地方。另外在Windows下常用的一些通讯控件如MSComm等在WinCE.net下就不能正确使用了。
本监控系统采用API函数实现串口通讯。以下分几个问题介绍串口通讯及整个系统的实现。
5.1打开串口
首先是打开串口,这是串口通讯的第一步。其代码为:
BOOLCMainDlg::onInitDialog()
{
......
m_hComm=CreateFile(_T(“COM1:“),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);//打开串口的操作,需要注意
WinCE.net系统与Windows系统表达方式的细微不同,WinCE.net需要在串口后加上冒号;
SetupComm(m_hComm,1024,1024);//初始化串口的输入,输出缓冲区参数;
SetCommState(m_hComm,&m_dcb);//配置串口参数;m_dcb为设置好的参数结构;
......
SetCommTimeouts(m_hComm,&timeout);//设置通讯超时时间参数;
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
//清空输入,输出缓冲区的字符,为开始接受数据,进入监控状态做好准备;
......5.2读串口线程
其次是启动读串口线程,它让读串口程序不停地在后台运行,而不影响前台程序的工作。与此有关的代码为:
BOOLCMainDlg::onInitDialog()
{
......
ReadFile(m_hComm,inBuffer+iBufLen,INBUFFERLEN-iBufLen,&dwBytes,NULL);//从串口读数据;
iBufLen+=dwBytes;
for(inti=”0“;i{
if(inBuffer[i]==”\r“)//以连接的设备为OMRONPLC为例,其通讯协议规定应答应当以”\r“结尾;
inBuffer[i]=0;//字符串结束标志;
switch(m_iDlgType)//m_iDlgType为代表不同对话框的标志变量;
{
case子对话框1标志:
子对话框1.ProcData(inBuffer,i);//不同对话框中对命令应答的处理,ProcData为处理函数名;
break;
......
}
......
}5.3各子对话框发送写命令
各个子对话框根据需要,采用定时器的形式,定时向PLC发送命令。以OMRONPLC为例,在发送命令时,根据OMRONPLC的通讯协议,还需对发送的命令字符串加校验码。这些程序代码为:
void子对话框1类::onTimer(UINTnIDEvent)
{
......
strcpy(m_szC
md,”@00RR00000001“);//OMRONPLC的命令字符串;
GenXor(m_szCmd,result);//进行校验码计算,调用GenXor函数;
sprintf(szTailer,”%02X*\r“,result);//OMRONPLC通讯协议以“*\r”结尾;
strcat(m_szCmd,szTailer);//形成完整的通讯协议命令字符串;
WriteFile(m_hComm,m_szCmd,strlen(m_szCmd),&dwWriten,NULL);
//将命令字符串写入串口;
......
}
以下为上面所调用的计算校验码的代码:
voidGenXor(LPCSTRstrSource,char&result)//为计算校验码的函数,进行异或运算:
{
result=0;//为校验码赋初值;
intlen=“strlen”(strSource);//命令协议字符串的长度;
for(inti=“0”;iresult^=strSource[i];//按位进行异或;
}