`
guowee
  • 浏览: 174378 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Windows CE下的串口通信编程

阅读更多

现在大多数的笔记本 电脑都没有外置串口,这不奇怪,因为有更快更稳定的接口代替了串口。不过基于Windows CE的设备仍然保留着串口,而且目前看来串口的地位暂时不会动摇。目前流行的基于CE的设备很多都具有像导航、打电话等功能,而GPS 、GSM/GPRS模块都是外置串口的终端设备,你想不用串口都不行。

  上面我说了我有着自己的观点,我的观点就是不要把串口通信 封 装成类。我不明白为什么有些人总要把串口封装成类呢。把一个事物封装成类,那这个事物就一定是不易改变的,如果每次编写都要修改,那封装成类就一点意义都 没有了。设想如果MFC类总要改变的话,那我们用MFC编的程序也要修改同样次数了。如果编写超级终端一类的程序倒是可以将串口封装成类,因为超级终端只 管输入命令和显示输出数据,不对输出数据进行处理,那读串口的函数就可以一直使用而不必更改。但事实上串口通信大多数用来与终端设备进行通信,需要对终端 设备返回的数据进行处理。而返回的数据在什么时间返回、数据量的大小不是确定的,非要封装成类难度很大。

  正如CE的帮助文档所说,串口通信是最简单的通信之一。稍麻烦的是在读数据方面。

  一、打开串口

hSerial = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(m_hSerial == NULL)
{
 ///L"串口打开失败";
 return;
}

///配置串口

DCB PortDCB;
PortDCB.DCBlength = sizeof(DCB);
// 默认串口参数
GetCommState(hSerial, &PortDCB);
PortDCB.BaudRate = 115200; // baud
PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY;
PortDCB.StoPB its = ONESTOPBIT;
if (! SetCommState(hSerial, &PortDCB))
{
 ///L"配置串口失败";
 return;
}

////配置超时值

COMMTIMEOUTS CommTimeouts;

GetCommTimeouts(m_hSerial, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier = 10;
CommTimeouts.ReadTotalTimeoutConstant = 10;
CommTimeouts.WriteTotalTimeoutMultiplier = 50;
CommTimeouts.WriteTotalTimeoutConstant = 100;
if (!SetCommTimeouts(hSerial, &CommTimeouts))
{
 ///L"不能设置超时参数";
 return;
}


  CE的串口驱动 不 支持重叠,这个大家都知道的。这样的话收和发就要分开。要接收串口数据就必须创建一个线程专门用于接收数据。串口的配置不需要设置很多参数,默认的配置大 部分是不需要修改的。一般改动就是波特率、位数、奇偶校检等几项。超时值是需要改动的。ReadIntervalTimeout是指两个字符传送之间的超 时时间。一次写操作的超时时间等于WriteTotalTimeoutMultiplier 乘以 要发送的字符数 加上WriteTotalTimeoutConstant。 单位是毫秒。读操作的超时和写类似。所以设置超时是一个关键。设置太小可能丢失数据。

 

二、关闭串口

  关闭串口用关闭句柄函数。

if(hSerial != NULL)
{
 CloseHandle(hSerial);
 hSerial = NULL;
}


  三、向串口发送数据

WriteFile (hSerial, // 句柄
 &Byte, // 数据缓冲区地址
 nByte, // 数据大小
 &dwNumBytes, // 返回发送出去的字节数
 NULL // 不支持重叠
);


  向串口发送数据一般都会成功。需要注意的是如果终端设备需要一定处理时间或者称反应时间的话,那么两个写操作之间一定要注意时间间隔不能太小。具体的时间由终端设备的反应时间和缓冲区大小有关。

  四、读取串口数据

   串口麻烦就麻烦在读取数据上。除了考虑及时的读取数据外,还要解决接收到的数据的处理工作。如果在读取串口数据的线程中安置数据处理工作,那么可能会丢 失数据(终端设备发送数据但是没收到),也有可能不会丢失(终端设备发送的数据的时间、大小都是确定的)。如果肯定接收的数据在处理工作结束后终端设备才 发送数据,那么完全可以将数据处理工作放在读取串口的线程中。对于及时的读取数据,下面提供了一种解决办法:

*** 假设接收的都是字符 ***

UINT ReadThread(LPVOID pParam) ////接收串口数据线程
{
 HANDLE hPort = *(HANDLE*)pParam;
 BYTE Byte;
 int iCounter = 0;
 DWORD dwBytes;
 char ReceiveBuf[1000]; ///缓冲区的大小

 SetCommMask (hPort, EV_RXCHAR); ///只接收字符
 while (hPort != INVALID_HANDLE_VALUE)
 {
  DWORD dwCommStatus;
  WaitCommEvent(hPort, &dwCommStatus, 0);
  SetCommMask (hPort, EV_RXCHAR); ///重新设置要等待的信号
  //// 接收数据
  do
  {
   ReadFile(hPort, &Byte, 1, &dwBytes, 0);
   if(dwBytes == 1)
   {
    ReceiveBuf[iCounter++] = Byte;
    if(iCounter == 1000)
    {
     ///L"接收缓冲区已满";
     return -1;
    }
   }
  } while (dwBytes == 1);
  if(iCounter == 0) ////没接到数据
  {
   continue;
  }
  //////保存数据
  char* pTmp = new char[iCounter + 1];
  if(pTmp == NULL)
  {
   ///L"内存 不足,接收串口数据线程关闭";
   return -1;
  }
  memcpy(pTmp, ReceiveBuf, iCounter);
  pTmp[iCounter] = NULL; ////字符串结尾
  ////////创建新线程处理数据
  AfxBeginThread(ProcessData, pTmp); ////在ProcessData函数中处理数据。别忘了delete[] pTmp;
  iCounter = 0; ////清空计数器
 } ///////end while
 return 0;
}


  在ReadThread的代码中,对接收数据后的处理采用另外一个线程来执行,这种解决方法不适合所有需要,只适合读取终端设备返回来的少量数据。软件开发 者要编写串口读线程代码应该具体问题具体分析。另外如果想在任意时刻停止读串口线程,应该按如下形式调用函数:

SetCommMask(hPort,EV_RXCHAR|EV_TXEMPTY);

  EV_TXEMPTY表示当输出字符都发送出去作为一个事件。那么我们可以发送任意一个字符,这个字符发送出去后WaitCommEvent就返回。

分享到:
评论

相关推荐

    Windows CE串口编程

    用于在CE 系统下的串口通信编程,可以在vs2008IDE 下运行调试。

    windows CE串口编程

    wince下用evc写的一个串口通讯的程序

    Windows CE 6.0嵌入式高级编程(中文版)

    第1章 Windows Embedded CE 1.1 嵌入式 1.1.1 嵌入式设备 1.1.2 嵌入式软件 1.1.3 嵌入式设备和软件 1.2 Windows Embedded系列 1.3 Windows XP Embedded 1.4 Windows Embedded Point of Service 1.5 Windows ...

    windowsCE程序设计

    本书分为四个部分,介绍了windows基础编程过渡到windowsCE编程,并详细剖析了其中的工作原理,最后还讲解了高级主题。 其中涉及到windowsCE的内存管理、进程与线程、串口通信及驱动原理以及外壳编程等等。

    Windows CE程序设计

    第12章 - 串口通信 第13章 - Windows CE网络通信 第14章 - 设备间通信 第15章 - 桌面连接 第四部分 设备编程 第16章 - 浏览器Shell编程 第17章 - Pocket PC编程 第18章 - Pocket PC扩展 第19章 - Smartphone编程 第...

    文件操作与通信编程

    widows CE,文件操作,通信编程 掌握Windows CE的下的文件操作 掌握Windows CE下的串口通信编程

    基于Xscale 270 嵌入式Windows CE开发实验与实践

    本教程主要介绍Windows CE6.0在Xsacle PXA270上的移植,通过从浅入深的介绍,引领学生步入Windows CE6.0开发的大门,整个教程从Windows CE的理论介绍,到BSP的开发、应用程序的设计,贯穿Windows CE学习整个过程。...

    基于ep4ce6e cyclone4E FPGA设计的uart串口通信设计实验Verilog源码Quartus18.0工程文件

    基于ep4ce6e cyclone4E FPGA设计的uart串口通信设计实验Verilog源码Quartus18.0工程文件module uart_top( //顶层模块:将各个模块组合 //外部接口 input clk, //系统时钟50MHz input rst_n, //低电平复位 input ...

    VC++开发手机软件(PDF+源码).

    10.3 CE串口综合示例 10.4 GPS编程示例 第11章 网络编程概述 11.1 套接字编程基础 11.1.1 WinSock初始化和释放 11.1.2 创建套接字 11.1.3 关闭套接字 11.1.4 绑定套接字 11.1.5 监听套接字 11.1.6 等待...

    uart_state.rar_ep4ce15f17c8_fallzit_状态机

    基于状态机编写的串口通信实验,编程语言是Verilog HDL,可发送八位数据,在Altera的EP4CE15F17C8芯片上验证成功。(与另一个发送256位不同的是这个代码比较突出状态机的使用)。

    通信与网络中的单网络节点在WinCE系统下的程序设计

    一个好的节点既需要选择好的硬件的支持,也需要选择适合的软件控制[1],本文选择S3C6410的Arm11芯片作为节点CPU,选择WindowsCE 6.0作为运行在ARM上的嵌入式操作系统,通过网口,串口,SD卡完成相应的数据通信功能。...

    cc2530原理图

    64K 以及更高版本将支持用于 ZigBee RF4CE 的新型 RemoTI™ 堆栈,该堆栈是业内第一款符合 ZigBee RF4CE 协议的堆栈,并且更大容量的内存将允许片上空中下载以支持系统内重新编程。此外,CC2530 还结合了 1 个完全...

    基于物联网的照明控制系统—ARM客户端软件设计

    然后基于Windows CE 6.0操作系统,运用C#编程语言开发了ARM的客户端软件。经测试,客户端软件实现了按规划的协议将协调器上传数据发往服务端和将服务端下发数据发往协调器的功能,性能稳定,具有一定的实用价值。

    单网络节点在WinCE系统下的程序设计

    一个好的节点既需要选择好的硬件的支持,也需要选择适合的软件控制[1],本文选择S3C6410的Arm11芯片作为节点CPU,选择WindowsCE 6.0作为运行在ARM上的嵌入式操作系统,通过网口,串口,SD卡完成相应的数据通信功能。...

    WM版道路分析掌测v1.41版

    主要功能:《道路分析掌测》是在.net上开发的,运用现代编程技术和数据库管理技术,针对现场施工测量特点、仪器设备通讯、数据采集、计算、分析、图形显示和记录于一体的集成掌上电脑操作测量软件,具有体积小,智能...

    1794各模块介绍.pdf

    编程软件与ControlLogix是同一软件,提高了编程效率。 二、I/O模块 * 数字输入模块:1794-IB8、1794-IB16、1794-IM8 + 输入点数:8点或16点 + 输入电压:24VDC或220VAC + 信号延时(max):256us或512us或7.5ms...

    嵌入式学习心得-必看

    应用层是嵌入式系统的第四层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。 三、嵌入式开发的其他知识点 嵌入式开发中还涉及到其他一些...

    ARM 实验指导书第一册UCOS-II.doc

    此时出现了我们都较为熟悉的Palm OS,Windows CE,嵌入式Linux,Uc/OS操作系统,我们国内也出现了Hopen,Delta OS等操作系统。到今天,RTOS已经在全球形成了一个产业,每年RTOS和相关的开发工具(包括仿真器,逻辑...

    GEC2410B实验箱教学平台-基础实验教程

    85 3.1.8 串口通信应用实验...................................................... 91 3.1.9 4X4键盘控制实验...................................................... 102 3.1.10 实时时钟设计实验................

Global site tag (gtag.js) - Google Analytics