在长时间运行过程中,后台机与前台设备通讯的时候,偶尔出现通讯失败。比如我要采集数据,在采集过程中偶尔出现通讯失败,继续让程序运行,过一段时间之后又可以采到数据了,感觉好象是干扰问题,但也有人说是收到命令的动作问题,希望大侠可以提出宝贵意见或建议帮忙解决这一问题,谢谢!后台机与前台设备是通过屏蔽线连接的。不知道我描述得够清楚不。
解决方案 »
- 我用installshield打包oracle客户端后,VB程序提示 provider cannot be found,怎么解决?
- 联想的错、还是我的错呢???????
- 如何用vb在连接的SQL中建库啊(急需帮助)
- VB如何取得word 文档字符的个数。要求在不打开word文档发情况下。
- 怎么遍历程序所在的盘?
- 我想实现网上注册功能该怎么做呢???(用软件方法解决)用什么样的算法请给于提示
- 含泪再等一次!!
- VBA 的程序为何不执行了?
- 导入问题:怎么导入数值型的有问题?
- 判断文件夹是否存在
- 急需VB+Sql2000的兼职程序员,请帮忙推荐,谢谢
- 【实用代码】Windows Shell接口之VB实现(二):自动完成接口
那我是要提高波特率的同时再留出足够时间处理数据吗?
其实这个问题你在另一个我的帖子里也回答了,只是我不太明白,非常感谢你来,希望我的问题能解决
1.你的程序好像工作很长时间,看前面的对答,猜想你采用串行口通信。
2.关于采集数据,或许你采用定时轮询接收缓冲区的方式。
时间.检查你的程序关于时间的计算有无bug。另外,你对通信失败的描述不够全。
因为通信故障受到干扰,接收到数据错误,那就得增加容错措施。
所谓失败,连接不上,握手不成功?连接后,线路断开?
建议采用RTS/CTS 协议。
如果采用程序开始运行的时间为基准,那么程序运行24小时后,也发生转折。通信,主要是吃透目标机的通信协议。
通讯失败就是后台机没收到数据,而报通讯失败,但也可能是收到了数据,只是数据是错的从而校验和不一致导致失败,具体是那种情况我也不太清楚
1."因为通信故障受到干扰,接收到数据错误,那就得增加容错措施。"如何增加容错措施
2.RTS/CTS 协议是一种什么协议,如何操作
所谓时间bug,就是说问题出在关于时间相关的部位。
RTS/CTS 协议,需要有硬件连线下的应答方式,便于你确定通信双方之间是否在线。
看你前面叙述串口连接线是RS232转485,RS485口是非双工的.下位机侧应对此特性有所重视.
...如果通讯失败隔3秒重发,连发3次,如3次都不成功报通讯失败,通讯成功就以2秒的频率发送采集命令...
看上段叙述,积极的通信中断不会造成无法"快速反应",而是克服程序使用中遭遇的无法预见的容错措施.
请仔细查看你的代码,仅可能准确定义变量的作用域.对所有变量都应定义,少用或慎用变体变量.
Private Sub mscom485_OnComm()
Static nPoint As Long, arInput(MODEM_BUFF_SIZE - 1) As Byte
Dim buffer As Variant
Dim ar() As Byte
Dim i As Long
Dim mm As Long, nn As Long
Dim checksum As String
Dim nReceiveByte As Long, nTotalByte As Long
Select Case mscom485.CommEvent
Case comEvReceive
nReceiveByte = mscom485.InBufferCount
buffer = mscom485.Input
ar = buffer
If (nReceiveByte + nPoint) > MODEM_BUFF_SIZE Then nPoint = 0
For i = 0 To nReceiveByte - 1
arInput(i + nPoint) = ar(i)
Next
nPoint = nPoint + i
If (arInput(0) = Val(m_CmdTmp.PlantAddr)) Then '是已发出命令的回传数据
Select Case Val("&H" & m_CmdTmp.CmdType) '不能用arInput(1)
Case &H0, &H2, &H5 '00号,02,05号命令
nTotalByte = arInput(2)
If nPoint = nTotalByte + 4 Then
mm = 0
For i = 0 To nTotalByte + 2
mm = mm + arInput(i) '校验和前面全部字符的和
Next
checksum = Hex(mm)
'为避免检验和少于2位数
Do While Len(checksum) < 2
checksum = "0" & checksum
Loop
'为避免检验和超过了2位数
mm = Val("&H" & right(checksum, 2))
nn = arInput(nTotalByte + 3)
If mm = nn Then '校验和正确
ReDim ArrayInput(nTotalByte + 1)
For i = 0 To nTotalByte + 1 '不需要首字节(地址),从命令号开始
'也不要末字节(校验)
ArrayInput(i) = arInput(i + 1)
Next
timer485.Enabled = False '已收到正确的回传数据,不再重发,中止2s定时
Call SignalProcess '处理数据后(入库,刷新显示),发送下一命令
End If
nPoint = 0
End If
Case &H1, &H3, &H4, &H6, &H7, &H8, &H9, &HA, &HB, &HC, &HD, &HE '01号,03号,04号命令
timer485.Enabled = False '已收到正确的回传数据,中止2s定时,不再重发
ReDim ArrayInput(0)
ArrayInput(0) = Val("&H" & m_CmdTmp.CmdType)
Call SignalProcess '处理数据后(刷新显示),发送下一命令
nPoint = 0
End Select
Else
nPoint = 0 '如果找不到字头则丢掉该字符串
End If
End Select
End Sub
这是串口收到数据的处理