我利用串口发送数据,一次发送一包数据,下位机会对接收到的这一包数据进行校验处理,如果错误则发送#ero\r\n给上位机,要求重发这一包数据,之前发送数据包的的程序如下:
Do While Not EOF(1) '循环至文件尾
'读出一行数据放入one_line中
Line Input #1, one_line
'得到一行数据,然后串口发送处理
MSComm1.Output = one_line
DoEvents
Loopvb控制接收,我把接收到下位机的数据放到b(0)里
Case comEvReceive
b(0) = MSComm1.Input
高手看看我出错后重发是应该加到什么位置比较合适,该怎么判断实现呢,谢谢!!!
解决方案 »
- 有关vb导出的问题!!呜,俺刚参加工作就碰到个难题,哪个仁兄能好心出手帮小妹一把呀!
- 用toolbar和imagelist制作工具栏,透明的按钮图片不透明
- 如果一个do until或其它循环中发生错误,要如何处理
- VB EXCEL 访问 速度 检索 二分法
- 在哪里把这几个控件找出来,教教vb新手?
- 麻烦大家给些listview控件的简单列子啊
- vb搜索问题
- 有什么方法可以知道收藏夹的路径
- 做ftp客户端的下载上传功能,要稳定而且能续传,用什么写好?还是用控件?
- 文件咋个打不开哟???你们来看看。。。。。
- 请问VB怎么实现MSHFlexGrid支持ctrl+c、ctrl+v
- [招聘]资深VB工程师(北京)
'Function Name: ReadCom(AddressStr As String, MemorType As String, RefValue As String) As String '读取串口
'Function: 通过串口读取全部数据
'Author: DengyiWolf
'Date: 20051223
Function ReadCom(AddressStr As String, MemorType As String, RefValue As String) As String '读取串口
Dim s_Buffer(9) As Byte, R_Buffer() As Byte
Dim i As Integer
Dim ReadbuffTotxt As String
i = 0
'发送数据协议为 55 AA 2A FF 80 00 00 00 00 Xor
'FF 为地址
'80 为存储器型号
'0---0 数据位
'Xor 校验位
s_Buffer(0) = &H55
s_Buffer(1) = &HAA
s_Buffer(2) = &H2A
s_Buffer(3) = "&H" & AddressStr '下位机地址 'FF
s_Buffer(4) = "&H" & Trim(MemorType) '存储器型号 '80
s_Buffer(5) = "&H00"
s_Buffer(6) = "&H00"
'//高位置前,低位置后
If RefValue > 255 Then
s_Buffer(7) = "&H" & "0" & Left(Hex(RefValue), 1)
s_Buffer(8) = "&H" & Right(Hex(RefValue), 2)
Else
s_Buffer(7) = "&H00"
s_Buffer(8) = "&H" & Hex(RefValue)
End If
s_Buffer(9) = CByte("&H0") & s_Buffer(3) Xor s_Buffer(4) Xor s_Buffer(5) Xor s_Buffer(6) Xor s_Buffer(7) Xor s_Buffer(8) '校验码
TempStr1 = ""
For i = 0 To UBound(s_Buffer)
TempStr1 = TempStr1 & Space(1) & IIf(Len(Hex(s_Buffer(i))) = 1, "0" + Hex(s_Buffer(i)), Hex(s_Buffer(i)))
Next
ReSend: '重发
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.Output = s_Buffer
Sleep (50)
R_Buffer = MSComm1.Input
If UBound(R_Buffer) = 13 Then
For i = 0 To UBound(R_Buffer)
ReadbuffTotxt = ReadbuffTotxt & IIf(Len(Hex(R_Buffer(i))) = 1, "0" + Hex(R_Buffer(i)), Hex(R_Buffer(i)))
Next
ReadCom = ReadbuffTotxt
Else '重发,重发超过15次,则超时
If i < 15 Then
i = i + 1
GoTo ReSend '跳到重发位置
Else
ReadCom = 0 '超时
End If
End If
End Function
还是不明白上位机得到的 UBound(R_Buffer)值让下位机知道..
(XOR校验位)
下位机接收到数据后,根据同样的协议,返回发送指令的所需数据.上位机得到后,判断是否长度是否足够(是否需要的数据)如果接收数据正确返回正确数据给函数,并返回否则初始化串口,重新发送
重发次数超出一定数据后,报错,超时