串口通信程序-进者有分!
程序要实现的功能简介:
从高频设备上的人体或体模中通过光纤测温设备采集到温度,传输温度数值给我(硬件厂商解决的问题),需要我先给它一个信号,它发送数据给我,温度精确到±0.3度,采集到数据时时画图存数据库,打印
通信接口:RS232
做的功课:
1:简单了解mscomm控件,通过查询方式和事件方式实现两台计算机收发字符
2:采集到数据时时画图存数据库,打印功能没问题,可以解决
需要解决的问题:
因为从来没接触过串口通信的问题,以前也没用过Mscomm控件,所以很不了解,简单说就是很菜,希望大家耐心指导,谢谢
1:要实现上述功能,要我给硬件厂商提出什么样的要求,例如几位传输,用哪种校验方式,如何在突然断电重新工作能收到正确的数据等,我不是很清楚,希望详细些
2:我要先给一个信号,这个信号一般是什么样的
3:如何把接收到的二进制数据(肯定是小数的)转换为十进制数值
4:对于传输中出现的错误,怎么知道是哪种错误,如何处理能得到正确的数据
5:有这方面的源程序,研究一下最好
[解决办法]
通常情况下 通信的命令桢格式如下:
STX+ADD+CMD+[Data]+ETX+CHECK
STX:通信命令起始符号,是一个通信命令桢的开始。这个字符不可重复。
ADD:下位机地址,每个下位机都拥有惟一的下位机地址,它标识了上位机通信的对象,不可重复。
CMD:通信命令,用户定义通信功能,一般分为:读写两种。
Data:可选,作为对CMD的补充,比如你要对下位机写数据,那么这个Data就可以作为写入的数据。
ETX:通信命令桢的结束符号,是一个命令桢的结束,这个字符也是不可重复的。
CHECK:校验和,一般是对从STX到ETX的一种校验计算,通信双方可以通过算法计算出正确的校验值,和这个通信接收到的值进行比较,如果相同,标识本次通信正确,如果不相同标识本次通信不正确。
http://download.csdn.net/detail/veron_04/4037248
http://download.csdn.net/detail/veron_04/3601715
[解决办法]
下一个串口模拟软件,测试一下。串口就相当一个服务,你发给它一个消息,它给你返回一个消息,消息格式是二进制数据,你需要转换一下。
这之前做类似程序是下一个串口模拟工具,然后用UDP模拟一个客户端,一个COM端,这边发个指令,那就通过模拟串口收到后返回一个数据,很简单的。主要还是集中在你的需求和业务上。
[解决办法]
客户端与模拟端中间通过串口转发,流程就是 客户端<--->串口模拟软件<--->UDP模拟串口端,你在串口模拟器里设置用UDP转发,它就可以发到你listen的端口上,你reply就可以传给客户端。客户端只要打开虚拟的COM设置通讯就行了
[解决办法]
CHECK怎么算? 为什么我随便填也可以??
[解决办法]
我上传一个比较合适楼主意思的例程,是一本教科书上自带的,应该对你有帮助
http://download.csdn.net/detail/sosoben/4603903
[解决办法]
modbus协议
[解决办法]
VB中MScomm控件通信方式的使用 1 引言
VB开发串口通信程序常用的方法是利用VB自身提供的控件MScomm来实现,该控件隐藏了大部分串口通信的底层运行过程和许多烦琐的处理过程,将串口封装起来,操作容易、易实现。同时支持查询法和事件驱动通信的机制。文中主要介绍两种通信方法的使用。
2 查询法[ ]
查询法是通过周期性地读取缓冲区的信号来发现是否有事件发生并进行处理的方法。它不使用端口的硬件中断,必须在足够频繁地查询端口的情况下才能保证不会遗失任何数据或者事件,查询的频率取决于缓存的大小、数据量和对快速响应的要求。查询法不具有自动判断通信的“智能”化,需要人为启动接收或发送数据。在通信发生前就用查询法来判断接收数据,难免额外占用CPU的资源,在庞大的实时系统中会有诸多不便。因此,查询法实用于较小、简单的程序。对于简单的发送接收程序,设置Rthreshold一0(不触发OnComm事件),MScomm1.Inputlen=0(一次从接收缓冲区读取所有字节)示例如下:MSComm1.Output=SendCommand’sendcommand代表发送命令帧,不同的通信协议有不同的发送帧格式Do ’有的也用SLEEP函数来延时处理
DoEvents()
Loop Untill MSComm1.InbufferCount﹥一Receivelen’接收字符串长度
Do Receivedata= M SComm1.Input
Loop Until1.MSComm1.InbufferCount=0’读完应答帧
3 事件驱动法[ ]
事件驱动法是利用MScomm控件的OnComm事件触发机制来完成的。每当有通信错误或通信数据发生时,就会产生此事件。该方法能自动判断通信的发生并触发中断响应,只有通信发生时才响应中断,通信未发生时不占用CPU资源,此时能够进行其他工作。事件的处理是通过判断CommEvent属性值获得事件类型,再根据事件类型进行相应数据处理。大部分通信程序都使用该方法,但对于不同的通信要求,该方法的使用也有所不同。
3.1 定长数据的处理
事件驱动法能够自动判断通信的发生并触发中断响应是通过设置MScomm控件的Rthreshold属性来实现的。当Rthreshold: ”时,接收缓冲区收到”个字节的数据就触发OnComm事件。可见,对仪表发送定长数据的处理很方便,只要设置Rthreshold为接收数据的固定长度,InputLen属性设置为O,在OnComm事件中编写处理过程。示例如下:
Private Sub MSComml— OnComm()
Dim Receivedata() As Byte
Dim bytData As Variant’接收缓冲区读取数据
On Error Resume Next
Select Case CommEvent
Case comEvReceive
bytData=M SComm1.Input
Redim Receivedata (Ubound(bytData)As Byte
For i一0 To Ubound(bytData)
Receivedata(i)= bytData(i)
Next i
End Select
End Sub
3.2 不定长数据的处理
在某些串口通信中,仪表发送的数据帧是不定长的,在使用事件驱动法响应时,为了实现实时监测功能,接收数据时读取要尽可能的快。在程序开始运行时设置Rthreshold属性,接收缓冲区收到1字节产生OnComm事件,InputLen一1(每次读取一个字节),等到程序接收一帧完整数据后,计算出当前帧数据长度,再将Rthreshold属性修改为帧长度,则接收缓冲区在收到一帧数据后,MSComm控件才会触发一个OnComm事件。这样就会有更多的时间对数据进行计算和处理。
比如数据帧最大长度为26,帧格式首字节为02H,第二个字节表示状态,反映发送的字节数Len,之后的第3到24个字节为需处理的数据,无结束标志。先设置Rthreshold=
1,然后计算实际长度Len,OnComm事件部分处理程序如下:
Dim Len As Interger Dim Receivedata(4)As Byte ’根据具体需要设定数组大小Dim
bytData As Variant’接收缓冲区读取数据Private Sub MSComml— OnComm()Select Case
CommEvent ’判断MSComml通信事件Case comEvReceive
’收到Rthreshold个字节产生的接收事件bytData=MSComm1.Input
’读取一个接收字节Receivedata(1)一bytData (O)’转换保存到字节数据类型数组Receivedata(0)一2
Then ’判断是否为数据开始标志O2HRthreshold一0 ’关闭OnComm事件接收bytData=MSComm1.Input
’读取一个接收字节Receivedata(1)一bytData (0)
’转换保存到字节数据类型⋯.在此写计算实际字节数LenbytData= MSComm1.Input⋯
’数据处理程序Rthreshold=Len+2 ’打开MSComml事件接收再按完整数据帧触发事件ElseRthreshold=
1End Select End Sub
4
二者相结合的方法及其实现当测试系统要求不定时地将不定长的数据通过串口传给PC机,PC机要实时接收并进行处理保存时,仅用查询法或事件驱动法是不合适的,需用二者相结合的方法来实现。通过在OnComm事件中查询端口,当串口缓冲区接收到数据时,触发OnComm事件,这时启动定时器查询端口,同时关闭OnComm事件触发,然后采用适当的查询频率以保证不丢失数据,接收完一帧数据后再打开OnComm事件等待下一次的触发。此时,当串口缓冲区没有接收到数据时,不触发OnComm事件也就不会启动定时器查询端口,释放了CPU资源,缩短了程序运行时间。
比如测试要求:
(1)仪表每次不定时发送一帧数据,帧长从12字节到22字节不等。
(2)帧格式首字节为4CH,之后为10到20个字节之间的数据,尾字节为24H。
在程序中设置MSComml的Rthreshold=1,InputLen一0,定时器Timer1.interval一1,
通信部分的主要程序代码如下:
Dim M ydata(22)AS Byte
Dim i as Integer
Dim Receivedata()as Byte
Private Sub MSComml
— OnComm()
On Error Resume Next
i一0
Select Case M SCom m1.Com mEvent
Case com EvReceive
Timer1.enabled=true
MSComm1.Rthreshold= 0
End Select
End Sub
Private Sub Timerl— Timer()
if M SComm1.InbufferCount﹥ 0 Then
Receivedata= M SComm 1.input
Else
Timer1.Enabled= Flase
End if
Do
M yData(i)==Receivedata(i)
if Mydata(i)一&H24 Then
MSComm1. Rthreshold= 1
Exit Do
End if
i+ 1
Loop
End Sub
5 结束语
在计算机与程控电子设备构成的测试控制系统中,串口通信的情况各有所异,使用合适的通信方法,才能保证数据采集的实时性、正确性,对数据采集完之后的数据处理部分以及数据库操作程序的实现部分均没有影响。确保测试控制系统的可靠性、稳定性。
[解决办法]
楼上说的很清楚,还有什么不明白呢请联系我
[解决办法]
不管硬件采取什么方式发给你,最好是一问一答,当然那边也可以一直发送,只是你收到要分辨正确数据和错误数据,最好用串口调试工具先把数据收正确,搞清楚数据格式,然后再开始编程序
[解决办法]
采用modbus的格式比较好,另外下个通信助手便于调试。
http://download.csdn.net/detail/adaiya110/4623111
[解决办法]
串口操作肯定要用校验的。要不数据是不是正常的你没法确定。如果你可以定,你还应该有确认的程序
就是一、你发指令给硬件,二、硬件给你数据、三、你校验正确,并存储完成,你确认。完成,第三部要加一个,如果校验不正确,要求硬件重发,或有相应的错误处理才行,要不你的程序会出现很多乱七八糟的数据。
[解决办法]
我的链接重发
http://download.csdn.net/detail/sosoben/4603903http://download.csdn.net/detail/sosoben/4603903
至于校验那里,我现在用到一个测量仪器,也是需要BCC按位取异或校验的,但我填00也一样可以,所以我就没花时间去搞了, 取异或是XOR 你就拿响应的数据进行这个运算就行啦
[解决办法]
要串口程序的话,楼主找我