`
guowee
  • 浏览: 177286 次
  • 性别: 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串口编程

    在Windows CE系统中进行串口通信编程是一项关键的技术任务,特别是在设备驱动开发、嵌入式系统和物联网(IoT)应用中。Windows CE是微软针对小型设备开发的操作系统,它提供了一个精简版的Windows环境,支持多种硬件...

    Windows CE串口编程要点

    在嵌入式系统开发领域,串口通信是一项基础且重要的技术,特别是在Windows CE平台上,掌握串口编程对于实现设备间的数据交换至关重要。本文旨在深入解析Windows CE串口编程的核心知识点,包括串口的基本操作流程、...

    Windows CE 串口通信的实现

    通过以上介绍可以看出,在Windows CE环境下实现串口通信虽然存在一些特殊性,但整体流程与传统Windows环境相似。了解这些基础知识有助于开发者更好地掌握在该平台上进行串口通信的方法和技术。随着嵌入式系统的不断...

    WindowsCE串口通信的实现

    综上所述,Windows CE串口通信的实现涉及到对Windows CE操作系统和串口API函数的熟悉。开发者需要掌握如何使用这些API来正确打开串口设备、设置通信参数、处理通信事件以及管理线程和资源。此外,还需关注通信协议...

    windows CE 嵌入式编程

    从以上描述可以看出,Windows CE嵌入式编程涵盖了串口通信、XML处理、数据库管理以及多线程编程等多个方面,这些知识是嵌入式开发者必须掌握的技能,以便能够开发出高性能、高稳定性的嵌入式应用程序。在实际应用中...

    windows CE串口编程

    在Windows CE(简称WinCE)平台上进行串口编程是一项重要的技术任务,特别是在开发嵌入式系统和设备通信时。...通过分析和学习这个示例,你可以更好地理解WinCE下的串口通信机制,为自己的项目提供参考。

    WINCE下串口操作C++类 Windows+CE嵌入式高级编程及其实例详解(用C++

    在Windows CE(简称WinCE)环境下,串口通信是设备之间进行数据交换的重要方式,尤其在嵌入式系统中,其应用广泛。本主题将深入探讨如何在WinCE平台上使用C++进行串口操作,以及高级编程技巧和实例解析。 首先,...

    ce串口通讯源码

    本文将深入探讨“ce串口通讯源码”相关知识点,以帮助理解和应用此类技术。 “ce串口”指的是在Windows CE操作系统中的串行端口通信。Windows CE是微软开发的一个实时操作系统,常用于掌上设备、嵌入式系统等。串口...

    Windows+CE嵌入式高级编程及其实例详解.rar

    11. **设备互连与通信**:讲述蓝牙、USB、串口通信等技术在Windows CE上的实现,以及如何进行设备间的通信。 12. **电源管理**:解析Windows CE的电源管理框架,以及如何设计低功耗的应用程序。 13. **安全与加密*...

    EVC 串口通讯 编程范例

    EVC(Embedded Visual C++)是微软开发的一款嵌入式C++编程工具,主要用于Windows CE...通过学习并实践这个编程范例,开发者能够掌握在EVC环境下进行串口通信的基本技能,为实现各种嵌入式系统的通信功能打下坚实基础。

    CE下串口测试源码(基于VS2005,C#)

    标题中的“CE下串口测试源码(基于VS2005,C#)”指的是一个针对Windows CE操作系统的串口通信测试程序,它采用Microsoft Visual Studio 2005(VS2005)作为开发环境,并使用C#编程语言编写。在Windows CE环境下,串口...

    wince下串口编程(232可用)

    在Windows CE(简称WinCE)操作系统环境下,进行串口编程是一项关键的技术,尤其对于嵌入式设备和工业控制系统。本文将深入探讨如何在WinCE下实现串口通信,并结合提供的"SerialSample1"示例代码,来阐述相关知识点...

    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 ...

    Windows+CE嵌入式高级编程及其实例详解

    本书旨在帮助已经有一定C++基础知识的读者提升在Windows CE平台上的编程技能,通过丰富的实例,详细讲解了图形编程、对话框控件、进程管理、线程操作以及串口通信等多个关键领域的技术。 首先,我们来谈谈图形编程...

    Windows CE嵌入式高级编程及其实例详解

    8. **设备间通信(D2D)**:Windows CE提供了设备到设备的通信机制,如串口、USB、蓝牙等。了解如何利用D2D进行设备间的通信,可以实现各种嵌入式系统的集成。 9. **安全性**:在嵌入式系统中,数据安全和系统防护是...

    用于windows CE的程序。将串口接受到的一定格式数据通过网口以UDP方式转发

    2. **串口通信**:掌握串行通信的基本原理,包括波特率、数据位、停止位和校验位的设置,以及如何正确接收和发送数据。 3. **网络编程**:理解TCP/IP协议栈,尤其是UDP协议的工作机制,包括如何建立套接字,打包和...

    电信设备-基于WINDOWS+CE的降低串口通信丢包率的方法.zip

    本篇文章将深入探讨如何在Windows CE环境下降低串口通信的丢包率,确保数据的准确无误传输。 串口通信,也称为UART(通用异步收发传输器),是计算机硬件中的一种接口,用于与外部设备进行串行通信。在Windows CE...

    多个串口EVC串口编程代码实例

    总结来说,"多个串口EVC串口编程代码实例"涵盖了Windows CE环境下使用EVC进行串口通信的实践知识,包括串口的基本概念、EVC串口编程的API函数、实例化的代码示例,以及可能存在的库文件封装。对于想要在嵌入式领域...

    Evc串口通信编程宝典

    ### EVC串口通信编程知识点详解 #### 一、串口通信基础知识 串口通信是一种常用的设备间数据传输方式,特别是在嵌入式系统开发中应用广泛。EVC(Embedded Visual C++)是一种针对Windows CE平台的开发工具,常用于...

Global site tag (gtag.js) - Google Analytics