云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

  • 62 次阅读
  • 3 次下载
  • 2026/4/28 2:51:08

简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)

作者:龚建伟

2001.11.09(任意转载,请注明来自啸峰工作室及网址)

老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧。确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如。但我一直没有停止过用MSComm通讯控件,那么简单的东西,对付简单的任务完全可以,但当我们需要在程序中用多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通讯控件,如果这时你还不愿意自己编写底层,就用这个类:CserialPort类。

这是Remon Spekreijse写的一个串口类, 地址在: http://codeguru.earthweb.com/network/serialport.shtml

类作者Remon Spekreijse已作了一个基于对话框的同时检测4个串口示例的程序,在上面的网址和我主页的串口源码下载页也可以找到。我在这儿主要介绍如何将这个类应用到VC中基于文档的程序中。为了加深对串口数据处理的了解,我们利用这个类解决如下问题: 问题:

串口2(COM2)每隔1秒向串口1(COM1)发送的NEMA格式的报文:串头为$,串尾为*,中间为一个xxxx的整数( 比如2345,不足4位则前面以0代替代),最后是hh校验,规定hh为xxxx四个数的半BYTE校验和,最后加上回车与换行。整个数据包为$xxxx*hh

串口1收到上述报文后,校验正确后,将发来的数据显示在视窗中,并记下发来的正确帧数和错误帧数,若正确,还向串口2发送Y,串口2收到Y后将收到的Y的计数显示在视窗中。 测试方法:

将三线制串口线联接上同一台计算机的两个串口,编好程序后就可测试。如果没有两个串口的微机,自己改改程序。

好了,你可以先下载源程序: scporttest.zip(大小:49KB,VC6,WIN9X/2000,SerialPort.h SerialPort.cpp是两个类文件)

编程步骤:

◆1. 建立程序:

建立一个基于单文档的MFC应用程序SCPortTest,所有步骤保持缺省状态。

◆2. 添加类文件:

将SerialPort.h SerialPort.cpp两个类文件复制到工程文件夹中,用Project-Add to Project-Files命令将上述两个文件加入工程。并在SCPortTestView.h中将头文件SerialPort.h说明:#include \。

◆3. 人工增加串口消息响应函数:OnCommunication(WPARAM ch, LPARAM port)

首先在SCPortTestView.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区内有一个字符)的响应函数声明:

//{{AFX_MSG(CSCPortTestView)

afx_msg LONG OnCommunication(WPARAM ch, LPARAM port); //}}AFX_MSG

然后在SCPortTestView.cpp文件中进行WM_COMM_RXCHAR消息映射: BEGIN_MESSAGE_MAP(CSCPortTestView, CView) //{{AFX_MSG_MAP(CSCPortTestView)

ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication) //}}AFX_MSG_MAP END_MESSAGE_MAP()

接着在SCPortTestView.cpp中加入函数的实现:

LONG CSCPortTestView::OnCommunication(WPARAM ch, LPARAM port) { ….. }

注意:由于这个串口类加入工程后,没有自动的消息映射机制,因此上述步骤均需要手工添加。

◆4 初始化串口

在视创建时初始化串口,首先利用ClassWizardr按下图生成OnInitialUpdate()函数。

接着在SerialPort.h文件中说明我们在程序中要用到的全局变量: 保存两个串口接收数据:

char m_chChecksum; //用于COM1的校验和计算

CString m_strRXhhCOM1; //用于存放COM1接收的半BYTE校验字节hh CString m_strRXDataCOM1; //COM1接收数据 CString m_strRXDataCOM2; //COM2接收数据 UINT m_nRXErrorCOM1; //COM1接收数据错误帧数 UINT m_nRXErrorCOM2; //COM2接收数据错误帧数 UINT m_nRXCounterCOM1; //COM1接收数据错误帧数

UINT m_nRXCounterCOM2; //COM2接收数据错误帧数CString

再在SerialPort.h文件中说明串口类对象:CSerailPort m_ComPort[2]; (public)。 因为要初始化2个串口,所以这里用了数组。 下面是初始化串口1和串口2:

void CSCPortTestView::OnInitialUpdate() {

CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class m_chChecksum=0; //校验和置0

m_nRXErrorCOM1=0; //COM1接收数据错误帧数置0 m_nRXErrorCOM2=0; //COM2接收数据错误帧数置0 m_nRXCounterCOM1=0; //COM1接收数据错误帧数置0 m_nRXCounterCOM2=0; //COM2接收数据错误帧数置0 m_strRXhhCOM1.Empty(); //清空半BYTE校验hh存储变量

for(int i=0;i<2;i++) {

if (m_ComPort[i].InitPort(this,i+1,9600,'N',8,1,EV_RXFLAG | EV_RXCHAR,512)) //portnr=1(2),baud=960,parity='N',databits=8,stopsbits=1, //dwCommEvents=EV_RXCHAR|EV_RXFLAG,nBufferSize=512 {

m_ComPort[i].StartMonitoring(); //启动串口监视线程

if(i==1) SetTimer(1,1000,NULL); //设置定时器,1秒后发送数据 } else {

CString str;

str.Format(\没有发现,或被其它设备占用\AfxMessageBox(str); } } }

◆5 利用ClassWizard按下图生成CSCPortTestView 的时间消息WM_TIMER响应函数:

void CSCPortTestView::OnTimer(UINT nIDEvent) {

// TODO: Add your message handler code here and/or call default int randdata=rand()?00; //产生9000以内的随机数 CString strSendData;

strSendData.Format(\

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤) 作者:龚建伟 2001.11.09(任意转载,请注明来自啸峰工作室及网址) 老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧。确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如。但我一直没有停止过用MSComm通讯控件,那么简单的东西,对付简单的任务完全可以,但当我们需要在程序中用多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通讯控件,如果这时你还不愿意自己编写底层,就用这个类:CserialPort类。 这是Remon Spekreijse写的一个串口类, 地址在: http

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com