0 引言
在工业应用中,工控机常通过串口对外设进行监控、检测及数据交换 。Windows CE系统以其良好的性能在工业控制中得到越来越普遍的应用,但是它的一个开发工具eMbedded Visual C++3.0(eVC3.0)在串口编程方面。不但没有提供相应的控件,而且基于API的串口编程和一般的Visual C++也有所不同。下面就在课题[1]中对Advantech 工控机TPC-1240T的使用,谈谈自己的经验。1 W i n d o w s C E 系统和一般的 Windows 系统的区别Windows CE 是专门为信息设备、嵌入式应用等,设计的一种压缩的、高效的、可升级的操作系统 ;针对硬件资源有限,设计了多线程、多任务、全优先的操作环境。它最大的特点是系统比较稳定、实时性好、内存占用少。Windows CE 使用的是Unicode编码而非ASCII编码,不含16位子系统;它所提供的API是Win32 API一个变体,仅支持部分Win32 API。同时,微软针对其他操作系统开发的软件产品,未经修改,Windows CE将不能运行。
2 串行通信的实现
.1 Windows CE 3.0 串行通信概述,在Windows CE系统中,用户无法开发相应的应用程序。必须在PC 机的Windows系统中开发所需的程序,在eVC3.0环境下,通过以太网或串口下载到指定的Windows CE设备中。串行设备被视为的常规、可安装的流设备,可以象操作文件一样进行打开、关闭、读或写串口。Windows CE 3.0 支持windows NT或Windows 98所支持的多数通信函数。串口操作的主要函数见表1。表1 串行通信主要API函数 eVC3.0中串口编程思路和VC大致相同,但是
有几点要注意:
(1) Windows CE是Unicode编码,读取字符时候,要注意字节数的确定。
(2) VC3.0不支持重叠I/O,所有的函数中与OVERLAPPED 结构有关的参数都必须置为 NULL
(3) eVC3.0 不支持BuildCommDCB(),GetOverlappedResult()。
(4) eVC3.0中串口的写法和一般VC中的写法不同,如串口1,要写为“COM1:”而不能写为“COM1”。 虽然Windows CE不支持异步重叠I/O,但采用多线程技术,可以执行同样类型的重叠操作。这样不但可以充分利用CPU资源,还可以提高效率,课题中作者使用两个线程读写串行端口。
2.2 串口的打开及初始化(代码中出现没有定义的 变量和函数,是在相应的头文件中定义的,此 处将不作说明,以下同)
打开串口用CreateFile函数,串口总是存在的,此函数中的第5个参数必须置为OPEN_EXISTING;同时,因为Windows CE 不支持重叠I/O,第6个
参数不能置为FILE_FLAG_ OVERLAPPED。串口初始化主要是设置DCB结构中的参数,因为Win32API 不支持非二进制传输,fBinary 必须设置为
TRUE。初始化代码如下:
hFile=CreateFile(TEXT("COM1:"),
GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,
NULL);
CreateFileError();//初始化失败处理
DCB dcb;
COMMTIMEOUTS WTimeOuts;
dcb.DCBlength = sizeof (DCB);
GetCommState(hFile,&dcb);
dcb.fBinary = TRUE;
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(hFile,&dcb);
memset(&WriteTimeOuts,0,sizeof
(COMMTIMEOUTS));
SetCommTimeouts(hFile,&WTimeOuts);
程序中用GetCommState函数获得串口的默认设置,然后用户根据实际情况,给DCB结构中的参数赋值,然后用SetCommState设定,这样可以免去对DCB 结构中其它参数的设定。
2.3 写串口
写串口就是把字符写到相应的串口中去。写串口代码如下:
CString WriteBuf=m_strSend;
DWORD dwCommError ,dwWritten=0;
COMSTAT ComStat;
ClearCommError(hFile,&dwCommError,
&ComStat);
WriteFile(hFile, WriteBuf,2* WriteBuf.GetLength
(),&dwWritten,0);
WiteFileError();//写失败处理由于Windows CE使用是Unicode编码,则每个英文字符也是用两个字节表示的,这样实际写入的字节数是写字符长度的两倍,用2* WriteBuf.GetLength()表示可以给程序带来方便。
2.4 读串口
如果读、写的串口是不同的串口,要使这两个串口的波特率、校验位、数位等设置一致,否则不
能正确接收信息。读串口代码如下:
TCHAR ReadBuf[100]=TEXT("");
COMSTAT CommStat;
DWORD dwError,dwRead=0;
ClearCommError(hFile,&dwError,&CommStat);
ReadFile(hFile, ReadBuf, CommStat.cbInQue,
&dwRead, 0) ;
ReadFileError();//读失败处理
m_strReceive =ReadBuf;
.......//接收到的字符处理
用ClearCommError函数清除串口错误,并获得串口状态。接收到字节数,用CommStat.cbInQue表示,这样一般不会出现接收问题。
3 结束语
课题中把PC机中编写的程序,通过以太网下载到TPC-1240T中,实现了工控机和下位机之间的串口通信。随着Windows CE在工业控制中的广泛应用,基于eVC的串口通信应用将越来越重要。
参考文献:
[1] Microsoft eMbedded Visual C++3.0 MSDN[Z].
[2] e时代网络产品精解, 北京Advantech公司[Z].
[3] DOUGLAS B, Microsoft Windows CE 程序设计[M], 北京:
北京大学出版社, 1999, 8.
1楼
0
0
回复