提示:提问和回答别人的问题均可赢得积分
此问题已经被浏览19次,收藏:0次. 所属类别:[
其他]
问题:一包数据发送时出错,如何重发这一包数据"?
我利用串口发送数据,一次发送一包数据,下位机会对接收到的这一包数据进行校验处理,如果错误则发送#ero\r\n给上位机,要求重发这一包数据,之前发送数据包的的程序如下:
Do While Not EOF(1) '循环至文件尾
'读出一行数据放入one_line中
Line Input #1, one_line
'得到一行数据,然后串口发送处理
MSComm1.Output = one_line
DoEvents
Loop
vb控制接收,我把接收到下位机的数据放到b(0)里
Case comEvReceive
b(0) = MSComm1.Input
高手看看我出错后重发是应该加到什么位置比较合适,该怎么判断实现呢,谢谢!!!
提问时间:
2006-9-21 15:25:57 回答次数:
(15) 提问人:
软界网友 我来回答
回答(1)
最好应该一包发送完毕后 下位机在接收正常也发送握手命令,上位机根据回来后决定是否重复发送
回答(2)
每次发送完成以后等待下位机反馈,下位机应该在发送正确的时候也有一个正确的反馈。上位机接收到正确反馈以后发送下一个包,否则重发前一个包,等待超时也冲发,连续等待超时超过一定次数判定为通讯故障或者下位机死机之类的
回答(3)
各位高手能不能举个简单的例子,写一段小代码之类的,本人刚学,对于你们说的还是比较茫然的,谢谢了,完成之后必有高分送上
回答(4)
如果#ero\r\n也产生了错误呢?
应该是正确的话反馈一个正确包。 而不是错误的时候反馈错误包。。
回答(5)
那像你们说的正确之后发一反馈,那样岂不很浪费时间啊,我要发很多包数据呢,如果不浪费时间的话还可以,这样的话该怎么实现呢,在oncomm事件中用简单的if语句可以实现吗,有懂得朋友能不能给段代码参考一下,假设下位机正确接收一包数据后反馈回来$ok\r\n信息,大家看看该怎么处理呢,刚学vb,对它的一些语句很不是很理解,谢谢了
回答(6)
如果下位机没办法确保完整正确地收到数据速度快有什么用?
回答(8)
看在你求学的份上,发一份给你,看看你是否需要
回答(9)
'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
回答(10)
也正在学做串口...楼主的问题也是我想问的 ~_~插问句:
dengyiwolf(七星偃月刀) 两台机器好象不能用" GoTo ReSend '跳到重发位置 "吧,
还是不明白上位机得到的 UBound(R_Buffer)值让下位机知道..
回答(11)
非常感谢,先看一下,有不明白的地方还要向你请教
回答(12)
这个Sleep (50)是不是经串口发送出去数据后等待50ms的意思啊,不要这句不行吗,有什么作用呢,另外我在我的程序里直接用Sleep ()怎么不可以呢,总是出错,我到MSDN Library中去查也查不到,这个sleep函数是不是自己定义的阿?还是怎么用的呢,谢谢
回答(13)
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
这是一个api
回答(14)
通过上位机发送的一定的数据(按协议发送) 55 AA 2A FF 80 00 00 00 00 XOR
(XOR校验位)
下位机接收到数据后,根据同样的协议,返回发送指令的所需数据.
上位机得到后,判断是否长度是否足够(是否需要的数据)
如果接收数据正确返回正确数据给函数,并返回
否则初始化串口,重新发送
重发次数超出一定数据后,报错,超时
关键字:
br,
one_line,
重发这一包数据,
MSComm1,
Input,
发送数据,
一行数据,
串口发送,
下位机,
接收到,
数据放,
出错,
Do,
ve