RS-232-C端口实时监控软件的设计实现

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
文章标题:RS-232-C端口实时监控软件的设计实现
原 作 者:郎锐
原 出 处:天极网
发 布 者:loose_went
发布类型:转载



  摘要:

  本文介绍了在Microsoft Visual C++ 6.0环境下对RS-232-C串行端口进行编程,以及对后台监控程序所普遍涉及到的无阻塞后台运行、数据的实时接收和处理等问题的解决方法。

  一、 引言

  在实验室和工业应用中,受信道成本限制,串口常常作为计算机与外部串行设备之间的首选数据传输通道,而且由于串行通信方便易行,许多设备和计算机都可以通过串口对外设进行控制、检测,串口通讯日益成为计算机和外设进行通讯、获取由外设采集到的监测数据的一个非常重要的手段。本文所描述的程序实例运行于Windows 9x操作系统下,可后台运行、实时接收、处理从端口传来的数据,并能通过向串口发送命令来控制外设的动作。为了避免在实时监控数据时引发程序阻塞,在本程序中引入了线程和端口中断响应等技术。

  二、 程序设计思路

  由于本程序要对串行端口进行实时监控,这就要求它是一个后台程序,在监控的同时可以在前台进行其他一些于之无关的操作。因而在实现时即要避免无时无刻都在反复读端口的效率低下的轮询方式,又不能因为来不及处理而将突然到达的监测数据丢失。只有采取端口中断的异步方式才能实现高效、安全的监控过程,只要一有数据到达端口,马上抛出中断请求,中断处理函数便会及时启动以处理到来的数据,从而避免了轮询间隙丢时数据的可能。而在大部分无数据到达的时间内不会有中断抛出,中断处理函数也不会执行,即仅仅在有数据到达的一瞬间进行工作,此效率不可谓不高。

  综上所述,要实现上述要求,就要用到下列技术来解决所遇到的关键性问题:一是采用多线程来避免在进行文件操作等耗时操作时会引发阻塞现象的发生。同时为了防止多个线程同时对同一个变量进行操作引起时序上的差错,为了保持线程的同步,还采取了临界区加解锁的技术;二是对端口的数据读取方式采取中断响应模式,具体原因前面以讲的很清楚,在此不再赘述;三是使用了定时器,以满足实时监控类程序的实时显示功能,以便及时的将所接收到的动态数据及时的反映到屏
幕上。

三、 RS-232-C串行端口监控软件的程序实现

  (一) 界面风格

  由于是实时监控软件,那就既要监测从外设传来的实时数据,又要通过串口向外设发送一些具体的指令以控制外设完成预先设定的动作。为了方便向串口发送命令可以在工具条上再加一个类似于"Internet Explorer 浏览器"风格的对话条,可以在初建工程时指定"Internet Explorer ReBars"风格,也可以通过添加Microsoft Visual C++ 6.0自带的"Dialog Bar"组件来实现。而要及时将从外部读取的数据显示给管理人员,并且留有相当记录以备查阅,可以选择列表视图来实现。

  (二) 串口的参数设置及打开

  对RS-232-C串行端口进行参数配置是使用串口进行通讯的必要条件。而且由于场合不同、用途、功能的不同对串口也采取不同的配置方式,为了使本程序更灵活,适应面更广,采取将所有的可能参数都预先设置在几个组合框中,可以在程序运行后随时更改设置。自定义一个设置串口参数的数据结构:

typedef struct tagCOM_CONFIG
{
int nPort; file://端口号,从COM1到COM4
int nBaud; file://波特率,从1200bps到57600bps(对应的宏为CBR_1200到CBR_57600)
int nData; file://数据位个数,7位或是8位
int nStop; file://停止位个数,可以是1位、1.5位、2位。
int nParity;//采取的校验方式,有无校验(NOPARITY)、
file://奇校验(ODDPARITY)和偶校验(EVENPARITY)等。
}COM_CONFIG;

  当选择好适当的参数后就可以根据设置好的端口配置情况打开通讯端口了。与以往DOS下串行通信程序不同的是,Windows操作平台下不提倡应用程序直接控制硬件(包括端口),也不让使用中断(除非打入到Ring0系统级),而是通过Windows操作系统提供的设备驱动程序来进行数据传递。在Windows操作系统下串行口和其他通讯端口一样是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,具体说明可参考MSDN帮助文件。下面是打开串口的部分关键代码:

//以创建文件的形式打开文件,并将返回的端口句柄保存于句柄idComDev之中。
idComDev =CreateFile( g_szCom_Port[g_com_config.nPort],
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
……
file://cfg为COMMCONFIG结构的实例对象,获取当前通讯口的状态。
cfg.dcb.DCBlength = sizeof( DCB ) ;
GetCommState( idComDev, &(cfg.dcb) ) ;
file://设置发送、接收缓存大小
SetupComm( idComDev, 4096, 4096 ) ;
// PurgeComm()是一个清除函数,它可以用来中止任何未决的后台读或写,并且可以冲掉I/O
file://缓冲区.其中:PURGE_TXABORT 用于中止后台写操作;PRUGE_RXABORT用于中止后台
file://读操作 ;PRUGE_TXCLEAR用于清除发送缓冲区;PRUGE_RXCLEAR用于清除接收缓冲区
PurgeComm(idComDev,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
file://根据设置的参数填充DCB结构对象dcb的各个数据成员变量
dcb.DCBlength = sizeof( DCB ) ;
GetCommState( idComDev, &dcb ) ;
file://设置端口通讯参数
dcb.BaudRate =g_Com_Baud[g_com_config.nBaud];
dcb.ByteSize =g_Com_ByteSize[g_com_config.nData];
dcb.Parity =g_Com_Parity[g_com_config.nParity] ;
dcb.StopBits =g_Com_StopBits[g_com_config.nStop];
file://硬件流控制
dcb.fDtrControl = DTR_CONTROL_DISABLE ;
dcb.fOutxCtsFlow = FALSE ;
dcb.fRtsControl = RTS_CONTROL_DISABLE ;
file://软件流控制
dcb.fInX = dcb.fOutX = FALSE ;
dcb.XonChar = (char)0xFF ;
dcb.XoffChar = (char)0XFF ;
dcb.XonLim = 100 ;
dcb.XoffLim = 100 ;
dcb.EvtChar=0x0d;
dcb.fBinary = TRUE ;
dcb.fParity = TRUE ;

file://超时控制的设置。超时有两种:区间超时:(仅对从端口中读取数据有用)它指定在读取两个字符之间要经历的时间;总超时: 当读或写特定的字节数需要的总时间超过某一阈值时,超时触发。计算超时可以根据公式:
file://ReadTotalTimeout = (ReadTotalTimeoutMultiplier * bytes_to_read)+
// ReadToTaltimeoutConstant
file://WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write)+
// WritetoTotalTimeoutConstant
file://如果在设置超时时参数为0则为无限等待,即无超时。
CommTimeOuts.ReadIntervalTimeout =MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier =0;
CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
CommTimeOuts.WriteTotalTimeoutMultiplier =2*9600/dcb.BaudRate ;
CommTimeOuts.WriteTotalTimeoutConstant = 25 ;
SetCommTimeouts(idComDev , &CommTimeOuts ) ;
file://根据设置好的dcb结构设置好通讯口的状态,并开启用于侦听端口,监视从外设传来的数
file://据的线程COMReadThreadProc。
if (SetCommState( idComDev, &dcb ))
{
m_bComPortOpen=TRUE;
g_hCom=idComDev;
AfxBeginThread(COMReadThreadProc,NULL,THREAD_PRIORITY_NORMAL);
return;
}
BOOL CCOMReadBuf::GetOneByte(BYTE *cb)
{
m_Lock.Lock();
if(m_nHead==m_nTail)
{
m_Lock.Unlock();
return FALSE;//空
}
*cb=m_readbuf[m_nTail];
if(m_nTail < m_nBufSize-1)
m_nTail++;
else
m_nTail=0;
m_Lock.Unlock();
return TRUE;//空
}

void CCOMReadBuf::Add(BYTE buf[],int nBytes)
{
int nt,i;
m_Lock.Lock();
for(i=0;iBR> {
nt=(m_nHead-m_nTail);
if(nt<0)
nt+=m_nBufSize;
if(nt+1==m_nBufSize)
break;//缓冲区满
m_readbuf[m_nHead]=buf[i];
if(m_nHead < m_nBufSize-1)
m_nHead++;
else
m_nHead=0;
}
m_Lock.Unlock();
}

  (四) 控制命令的发送

  控制命令可以从对话条上的编辑框获取,然后就可以通过写文件形式从端口发送出去,这部分实现起来较简单,也牵扯不到线程等技术。主要的代码主要有:

……
file://从对话条获取命令行
nRead=m_wndDlgBar.GetDlgItemText(IDC_EDIT_SEND,buf,500);
file://向端口发送命令
if(nRead>0)
{
buf[nRead]=0x0d;
buf[nRead+1]=0x00;
::WriteFile(g_hCom,buf,nRead+1,&dwActWrite,NULL);
}
……

  (五) 监测信息的显示

  本程序选择了列表视图作为数据的显示途径。为了能及时的将接收到的数据反馈给监控者,在视类中通过定时器完成定时刷新的功能,可以在视类的OnCreate() 函数里用SetTimer(……)函数在程序开始执行时打开定时器,在OnDestroy()里用KillTimer(……)函数在程序退出前先关闭定时器。在定时器消息 WM_TIMER的响应函数里完成向列表控件添加最新接收到的信息。主要语句有:

……
file://获取列表视相关的列表空间的句柄
CListCtrl &ListCtrl=GetListCtrl();
file://列表有两列:收到字符的时间和对应的信息
CTime t = CTime::GetCurrentTime();
CString szTemp;
szTemp.Format("%02d:%02d:%02d",t.GetHour(),t.GetMinute(),t.GetSecond());
file://向列表添加信息
int nIndex=ListCtrl.InsertItem(0, szTemp);
if(-1!=nIndex)
{
m_Buf[m_nCurPoint]=0;
ListCtrl.SetItemText(nIndex,1,LPTSTR(m_Buf));
}
……

  四、 调试与检测

  现在程序已经写完,可以编译运行。我们最好先检验一下机器串口是否能正常工作,可用DOS下的Comdebug程序检查。在确认串口工作正常后,如果条件允许最好同另一台计算机或外设相连,进行检测,如笔者用的是一台高频段数传电台。如果只有一台计算机也可以进行简单的测试:将计算机串口的第2脚和第3脚短接,即自己发送、接收数据。如果接有外设,当有采集到的数据送到端口时就会在列表中将时间和信息内容记录下来,也可以在对话条中输入命令来控制外设的工作状态,完全具备实时监控软件所需的功能。

  小结:

  串行通讯在通讯领域被广泛应用,标准的RS-232-C接口已成为计算机、外设、交换机和许多通讯设备的标准接口。计算机与计算机、计算机与外设等都可以通过RS-232-C接口进行方便的连接,以实现监视、控制外设和传输数据等目的。对于其他类型的串口通讯程序本文所介绍的方法也是值得借鉴的。本程序由
Microsoft Visual C++ 6.0编译、在Windows 98下运行通过。
C++_串口编程_官方示例:监视通信事件 修改后,这个程序就是同步的模式了,就是会一直处于等待状态,虽然不实用,但是好歹是能用了。用VSPD 和 XCOM V2.6 创建虚拟的COM串口后,可以用XCOM 创建一个 从COM2 发送文本到COM1的操作,之后就有输出了,这个EV_RXCHAR事件发生了。这是微软官方的一个例子,这个例子中,如果不做修改,那么他是可以异步运行的,会出现一个错误:官方也说了一下,但是不太好懂,我拷贝过来放在这里,作为参考。后续还可以多研究研究,作为一个最权威,最基本的例子,这个作为入门我觉得很不错,推荐给大家。 阅读详情

相关推荐

RS-232-C端口实时监控软件设计实现[VC++6]

作者:郎锐 更新时间: 2005-05-07       摘要:    本文介绍了在Microsoft Visual C++ 6.0环境下对RS-232-C串行端口进行编程,以及对后台监控程序所普遍涉及到的无阻塞后台运行、数据的实时接收和处理等问题的解决方法。    一、 引言    在实验室和工业应用中,受信道成本限制,串口常常作为计算机与外部串行设备之间的首选数据传输通道,而且由于串行通信方便

游乐园 2240

RS232中RTS和CTS的作用

本文详细解释了RS232通信技术中的RTS与CTS的作用,适合于那些对这2个概念不太清楚的童鞋,以及那些需要改变自定义设置的同学

简析煤矿井下变电所高压供电监控系统设计实现

结合煤矿井下供电系统的特点,以6kV供电回路作为监控对象,设计了煤矿井下变电所高压供电监测系统,可实现对高压配电开关的电压、电流、温度的实时监控

Acrel13916234315的博客 397

RS232的三种流控制模式

本文详细介绍了RS232通信技术中常用的3种流控技术,适合于对流控技术不太了解的同学

串口数据的抓取与监视

链接:https://item.taobao.com/item.htm?spm=a230r.1.14.116.76edd8f4XLxK7L&id=634070600059&ns=1&abbucket=10#detail 功能介绍 串口(RS232)监听器采用硬件监听串口数据的方式,直接把监听器串接在被监听的RS232(DB9)接口上。在不影响原有设备本身通讯的前提下,把数据监听进来,在电脑上分开显示监听到的TX、RX数据。 可同时监听TX、RX、CTS、RTS四个信号,并

woshiyiliangmin的博客 6835

利用RS485通信、串口收发数据的硬件连接及部分代码

软件设计思路:相当于单片机B的功能是否正常要通过屏幕显示出来,而单片机A是中间的桥梁,由于485是半双工,单片机B只有收到询问指令的数据才会发送响应的数据(单片机B程序不可更改,被动);单片机A和单片机B之间、单片机A和屏幕(一种可视化编辑的屏幕,规定好通信协议,利用485通信将字符串发送过去就能显示相应的内容,屏幕:TK607ID)。A、B总线接口,用于连接485总线。串口2是单片机A和单片机B用于通信的,串口1是单片机A和屏幕通信的,为了便于网络连接,串口1和串口2的网络标签做了一些区分。

nolate_chen的博客 8549

串口通讯-----串口监听线程全局函数(C++)

该代码是MFC环境下的,(非MFC)可进行局部修改; ``````` #include &quot;windows.h&quot; #define COMMBUFFER_SIZE 18 //每组数据字节数 //串口变量 HANDLE g_hComm = INVALID_HANDLE_VALUE;//串口句柄 HANDLE g_hCommThread = NULL;//线程句柄 OVERLAPP...

sazass的博客 5011

串口使用系列学习之C++如何进行流控

【代码】串口使用系列学习之C++如何进行流控。

学无止尽,谨言慎行! 2102

转: RS-232-C端口实时监控软件设计实现

RS-232-C端口实时监控软件设计实现 2002-03-06· ·郎锐 ··来自yesky

panqy82的专栏 819

[转][转]RS-232-C串行端口监控软件的程序实现

三、 RS-232-C串行端口监控软件的程序实现  (一) 界面风格  由于是实时监控软件,那就既要监测从外设传来的实时数据,又要通过串口向外设发送一些具体的指令以控制外设完成预先设定的动作。为了方便向串口发送命令可以在工具条上再加一个类似于"Internet Explorer 浏览器"风格的对话条,可以在初建工程时指定"Internet Explorer ReBars"风格,也可以通过添加Mic

2354

RS-232-C串行端口监控软件的程序实现

RS-232-C串行端口监控软件的程序实现  (一) 界面风格  由于是实时监控软件,那就既要监测从外设传来的实时数据,又要通过串口向外设发送一些具体的指令以控制外设完成预先设定的动作。为了方便向串口发送命令可以在工具条上再加一个类似于"Internet Explorer 浏览器"风格的对话条,可以在初建工程时指定"Internet Explorer ReBars"风格,也可以通过添加Micros

891

搭建多协议的串口服务器流程:RS-232RS-485和TCP/IP、MQTT网络协议(代码示例)

通过本项目,我们成功构建了一个支持多种协议的串口服务器。主要实现了以下功能:串口通信模块:能够与外部设备进行数据交换,支持数据的读取和发送。协议解析模块:支持TCP和MQTT协议的解析,能够接收来自网络的数据并进行处理。数据处理模块:使用队列和线程管理数据流,确保数据的实时性和完整性。在实现过程中,我们使用了Python的多线程和异步编程特性,以提高系统的性能和响应速度。最终的系统架构灵活且可扩展,能够适应多种设备和协议的需求。

嵌入式极客小张 3049

基于DSP的GPS数据解析:硬件设计软件实现与调试全解析

串口通信是嵌入式系统与外部设备交互的基础技术,其核心在于通过异步串行协议实现可靠的数据传输。在物联网终端、工业控制等场景中,设备常需实时处理来自传感器或模块的串口数据流,如GPS模块输出的NMEA-0183协议。为高效处理此类任务,常选用数字信号处理器(DSP)作为主控,其强大的实时处理能力与高效指令集,特别适合对连续数据流进行实时解析、滤波及格式转换。通过外扩专用UART芯片(如TL16C550C)并配合电平转换电路(如MAX232),可构建稳定硬件链路,将通信底层负载交由硬件,使DSP专注于应用层算法。

weixin_30791095的博客 410

C200系列开发:C200PC_C200PC物联网应用开发

CPU模块:负责处理数据和运行控制逻辑。通信模块:提供以太网、串行通信、Wi-Fi等通信接口。I/O模块:连接各种传感器和执行器,实现数据的输入和输出。电源模块:为控制器提供稳定的电源供应。:集成开发环境,支持控制器的编程、调试和仿真。Honeywell配置工具:用于配置控制器的通信参数、I/O端口等。Honeywell仿真器:用于在开发阶段模拟控制器的运行环境,进行初步测试。C200PC控制器是专门为工业物联网应用设计的高性能控制器,具备强大的数据处理能力和多种通信接口。

zhubeibei168的博客 1497

三菱FX系列PLC模拟器开发与应用全解析

PLC模拟器作为工业自动化领域的重要工具,通过软件方式模拟可编程逻辑控制器的硬件功能与通信协议,显著降低开发调试成本。其核心技术在于实现全功能指令集支持和真实通信协议模拟,包括RS-232/485串行通信和以太网通信的协议栈仿真。在自动化产线调试、教育培训等场景中,PLC模拟器能有效验证程序逻辑、测试通信协议,并提供零成本的编程实践环境。特别是对三菱FX系列PLC的模拟,需要精确处理寄存器系统、指令执行引擎等关键技术,确保与实体设备的功能一致性。通过合理选型和性能优化,模拟器可覆盖80%以上的开发调试需求,

weixin_33739627的博客 411

基于单片机与 PC 机通信的数据采集控制系统设计

设计出基于单片机与 PC 机通信的数据采集控制系统方法。 被控对象经传感器、电压变换电路、A/D 转换芯片与单片机相连,可将现场参数信息传送至单片机;单片机经继电器驱动控制被控对象运行。 单片机与 PC 机经电平转换芯片相连,实现远程通信功能。 该系统可以实时采集被控对象多种参数信息并送 PC 机处理,可以选择由 PC 机远程或单片机本地控制被控对象。

weixin_45905610的博客 2364
上一篇: 解决数据库中记录重复问题
下一篇: 一个十分好SOCKET程序源代码(服务器端)
aloxy
博客等级 码龄23年 39粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值