WinCE下的串口通信开发(VS2005,VB.Net,VC++)
 

WinCE下的串口通信开发

一、利用Visual Basic 开发很简单,因为有现成的控件可以直接调用

以VS2005为例,首先要从工具箱中找到SerialPort控件,将其拖到设计视图的下方,因为这些控件(包括定时控件Timer等)在运行的时候不会显示在视图中的。可以通过两种方法对串口进行配置,即点击控件的属性页码,在里面直接修改;也可以通过代码来配置成功,主要如下:

If VBSerial.IsOpen Then

VBSerial.Close()

End If

'串口设置:9600-N-8-1

With VBSerial

.PortName = "COM2"

.BaudRate = 9600

.Parity = Parity.None

.ReceivedBytesThreshold = 13 '接受的数据包长度

.DataBits = 8

.StopBits = StopBits.One

End With

串口的基本配置完成以后,下一步就是重要的事件属性了,既要设置数据接收的事件属性,在串口控件的属性页,点击事件标志(闪电状的),右方输入事件函数的名字即可,然后在事件函数中用Try,Catch读取串口字符,代码如下:

Dim rec_byte(LENGTH) As Byte '串口接收数据包     LENGTH是一个宏定义的数据包长度

Try

data_num = VBSerial.BytesToRead '串口接收到的字节数,用于测试调校程序

Me.VBSerial.Read(rec_byte, 0, LENGTH)

…………

…………

操作数组rec_byte(LENGTH)即可完成拆包等工作

Catch ex AsTimeoutException       '超时后的处理,包括读、写超时等

Timer1.Enabled = False

VBSerial.Close()

System.Threading.Thread.Sleep(300)

End Try

至此,即可完成Vb2005 开发WinCE的串口简单操作。

二、利用Visual C++开发

Visual C++没有封装好的现成通信控件可以直接调用,故需要用API函数或者第三方的类,这里推荐一个现成的类,见参考文件1中第十章的内容,这个类的详细内容与使用方法,书中写的已经非常仔细,这里我只将我的一点建议叙述,该类的读线程代码主要如下:

while (TRUE)

{

if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))

{

SetCommMask(ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );

//表示串口收到字符

if (evtMask & EV_RXCHAR)

{

ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);

if(cmState.cbInQue == (ceSeries->m_RThreshold) )//这个if内的内容是我的测试

{

willReadLen= cmState.cbInQue ;

if (willReadLen <= 0)

{

continue;

}

//分配内存

readBuf= new BYTE[willReadLen];

ZeroMemory(readBuf,willReadLen);

//读取串口数据

ReadFile(ceSeries->m_hComm,readBuf, willReadLen, &actualReadLen,0);

//如果读取的数据大于0,

if (actualReadLen>0)

{

//触发读取回调函数

if (ceSeries->m_OnSeriesRead)

{
                             ceSeries->m_OnSeriesRead(ceSeries->m_pOwner,readBuf,actualReadLen);
                        }

}

//释放内存

delete[] readBuf;

readBuf= NULL;

}

}

}

//如果收到读线程退出信号,则退出线程

if(WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)

{

break;

}

}

原来的代码中没有那个if来限制,这样每次读取的字符数最多有8个(之前我测试的时候,发现如果数据包长度大于8,就需要分几次读完,给实际应用中造成了不便),此处我加一个if语句来判别:

if(cmState.cbInQue ==(ceSeries->m_RThreshold) )

cmState.cbInQue表示现在的接受缓冲区队列中的字符个数,而ceSeries->m_RThreshold是需要预先设置好的,在串口的初始化中设置:

if(m_pSerial->OpenPort (this ,2,9600,0,8,0,16))

SetTimer(1,1000,NULL);

else

AfxMessageBox(L"串口打开失败");

最后一个16代表设置的数据包字符个数,这个是由通信协议来确定的。这样每次当检测事件为收到字符时,先等到接收缓冲区队列中的字符个数是16,然后才一次性读取字符,再发送消息给主线程,便于在主线程中一次处理拆包解析工作。

参考文献

[1] 汪兵.Windows CE 嵌入式高级编程与实例详解(用C++实现),[M].中国水利水电出版社,2008

WinCE下的串口通信开发(VS2005,VB.Net,VC++)的更多相关文章

  1. Mac下的串口通信-ORSSerialPort

    ================================2015/11/05======================================= 最近在工作中遇到有关Mac下串口通信 ...

  2. java下的串口通信-RXTX

    关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的 ...

  3. 详解linux下的串口通讯开发

    串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调 ...

  4. 【转载】详解linux下的串口通讯开发

    来源:https://www.cnblogs.com/sunyubo/archive/2010/09/26/2282116.html 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使 ...

  5. 具体解释linux下的串口通讯开发

    串行口是计算机一种经常使用的接口,具有连接线少.通讯简单,得到广泛的使用.经常使用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统. ...

  6. 在ubuntu下利用minicom实现串口通信

    windos有串口调试助手,linux下也有这样的工具——minicom.不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受.作为一款串口调试工具,虽然难看但 ...

  7. linux与开发板串口通信

    研究了一天的linux串口,结果改了树莓派的系统配置文件config.txt给改了导致系统崩溃....其实我感觉网上的大多数方法都是不符合新版本树莓派的,网上的方法是通过修改系统配置文件后安装mini ...

  8. Linux与Windows串口通信

    串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...

  9. Android USB转串口通信开发基本流程

    好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信.一直忙到近期,才慢慢闲下来,趁着这个周末不忙.记录下usb转串口通信开发的基 ...

随机推荐

  1. 前端小结(4)---- 页面加载loding....

    /*正在加载*/ function showLoading(elem) { var html = '<div class="loading"><div id=&q ...

  2. Java温故而知新(7)Object类及其方法讲解

    一.java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类 ...

  3. COGS2485 从零开始的序列

    传送门 题意:给定一个长为$n$的序列,定义$f(x)$表示所有(长为$x$的区间最小值)的最大值,求$f(1)$~$f(n)$. 看好多人都用并查集做的,然而我并不想写……既然品酒大会可以后缀数组+ ...

  4. 11.6NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 100 = 300\) 实际得分:\(100 +100 +100 = 300\) 学OI两年终于AK了一次qwq(虽然题目炒鸡水..) 纪念一下这令人激 ...

  5. PowerDesigner设置所有int主键自增脚本

    '*****************************************************************************dim model 'current mod ...

  6. Redis学习笔记(二) ---- PHP操作Redis各数据类型

    Redis 一.使用PHP操作Redis存储系统中的各类数据类型方法 1.String(字符串)操作 <?php // 1. 实例化 $redis = new Redis; // 2. 连接 r ...

  7. php扩展库

    php调用C/C++动态链接库 字数997 阅读28 评论0 喜欢0 本人最近在找实习,移动开发方向.有意者可直接与本人联系.谢谢! 一.简介 一般而言,php速度已经比较快,但是,对于一些较高级开发 ...

  8. React Native之React速学教程(上)

    概述 本篇为<React Native之React速学教程>的第一篇.本篇将从React的特点.如何使用React.JSX语法.组件(Component)以及组件的属性,状态等方面进行讲解 ...

  9. css3 background-sizing 属性,捎带 background-repeat 属性

    background-sizing: contain: 在指定大小的容器内把图像按照图像本身长宽比扩展到最大尺寸,有可能有留白 cover: 在指定大小的容器内,把图像按照图像本身的长宽比扩展到足够大 ...

  10. 用两个栈实现队列(C++ 和 Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 a ...