您的位置:控制工程论坛网论坛 » 教程与手册 » windows CE 3.0系统中基于eMbedded Visual C++3.0串行通信的实现

dqfxm2003

dqfxm2003   |   当前状态:离线

总积分:3995  2024年可用积分:0

注册时间: 2005-10-21

最后登录时间: 2011-01-14

空间 发短消息加为好友

windows CE 3.0系统中基于eMbedded Visual C++3.0串行通信的实现

dqfxm2003  发表于 2005/12/7 18:43:46      2229 查看 2 回复  [上一主题]  [下一主题]

手机阅读

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 回复
  • cia

    cia   |   当前状态:离线

    总积分:59  2024年可用积分:0

    注册时间: 2005-12-04

    最后登录时间: 2018-05-11

    空间 发短消息加为好友

    cia   发表于 2005/12/7 18:27:18

    safa
    2楼 回复本楼

    引用 cia 2005/12/7 18:27:18 发表于2楼的内容

  • scott

    scott   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2005-12-02

    最后登录时间: 2018-05-11

    空间 发短消息加为好友

    scott   发表于 2005/12/7 18:43:43

    ding
    3楼 回复本楼

    引用 scott 2005/12/7 18:43:43 发表于3楼的内容

总共 , 当前 /