您现在的位置: 软界网软界问答软件开发其他 > 问题显示
我要提问    
提示:提问和回答别人的问题均可赢得积分
加入收藏我要投诉 我来回答
此问题已经被浏览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)
如果下位机没办法确保完整正确地收到数据速度快有什么用?
回答人:软界网友 我来回答
回答(7)
大侠帮忙了,好结贴!
回答人:软界网友 我来回答
回答(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
我来回答
验证码