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++)的更多相关文章
- Mac下的串口通信-ORSSerialPort
================================2015/11/05======================================= 最近在工作中遇到有关Mac下串口通信 ...
- java下的串口通信-RXTX
关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的 ...
- 详解linux下的串口通讯开发
串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调 ...
- 【转载】详解linux下的串口通讯开发
来源:https://www.cnblogs.com/sunyubo/archive/2010/09/26/2282116.html 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使 ...
- 具体解释linux下的串口通讯开发
串行口是计算机一种经常使用的接口,具有连接线少.通讯简单,得到广泛的使用.经常使用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统. ...
- 在ubuntu下利用minicom实现串口通信
windos有串口调试助手,linux下也有这样的工具——minicom.不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受.作为一款串口调试工具,虽然难看但 ...
- linux与开发板串口通信
研究了一天的linux串口,结果改了树莓派的系统配置文件config.txt给改了导致系统崩溃....其实我感觉网上的大多数方法都是不符合新版本树莓派的,网上的方法是通过修改系统配置文件后安装mini ...
- Linux与Windows串口通信
串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...
- Android USB转串口通信开发基本流程
好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信.一直忙到近期,才慢慢闲下来,趁着这个周末不忙.记录下usb转串口通信开发的基 ...
随机推荐
- int btn = (Button) findViewById(View.getId());
int btn = (Button) findViewById(View.getId());//这句话中的btn不能用来和按钮键Button的id号去比较 如果想存储Button,可以这样做: Sta ...
- 程序员学炒股(6) 让我们来看一下7月份A股的表现
有了前几天的数据准备,那让我们看一下7月份的股市是牛市还是熊市呢? 牛市和熊市主要就看股票的涨跌分布情况,虽然我们看大盘数据,但是不过中石油占的A股市值太大了,并且中石油95%的股票都是大股东控制的相 ...
- 简单的java使用SAX解析xml
1.新建一个SAXTest类,继承import org.xml.sax.helpers.DefaultHandler类 package com.qiao.SrpingSource; import or ...
- 使用mpvue搭建一个初始小程序
1. 初始化一个 mpvue 项目 现代前端开发框架和环境都是需要 Node.js 的,如果没有的话,请先下载 nodejs 并安装. 然后打开命令行工具: # 1. 先检查下 Node.js 是否安 ...
- Django 中间件实现用户认证与IP频率限制
1.URL访问过滤 通过装饰器进行用户认证非常方便,但是在添加部分需要认证的功能时,就需要再次添加装饰器,如果通过中间件来实现,就不需要再进行添加的操作. import re LOGIN_URL = ...
- curl POST JSON
1. 场景 Controller接收json格式数据 封装bean @RequestMapping(value = "/bb", method = RequestMethod.PO ...
- rocketmq 两个线程同时消费一个消息
1.问题描述 线上项目A部署两台机器,每台机器两个实例,订阅同一个topic,消费心跳数据. (两台机器host1,host2) 运维同事 部署时 有一个实例用root账户重启的, 然后该实例出现两个 ...
- JSON对象的两个方法
JSON对象有两个方法,stringify()和parse(). 最简单的方法,这两个方法分别用于吧JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript值. ...
- c#开源项目收集
1百度云高速下载c#开源: https://github.com/ResourceHunter/BaiduPanDownloadWinform 2.IdaCsharp http://idacsharp ...
- JavaScript总结摘要
一 概述 1.什么是JavaScript? 基于对象.由事件驱动的解释性脚本语言. 2.JavaScript语法特点 区分大写小,这一点不同于HTML. 结尾的分号可有可无. 变量是弱类型的:变量在定 ...