为什么串口收到的数据都是3F

finallyperface 2006-10-16 11:29:50
我用MSCOMM开发的,做的是485通信,发的时候是“9600,M,8,1”,收的时候是“9600,S,8,1”,但是这样的话数据都收不到,现在是只能用“9600,M,8,1”,同时做收发,用一些串口调试软件这样设置的话,是可以收到正确数据的,但是我这样设置只能收到3F,我估计是MSCOMM因为收到的数据格式错误才会显示3F的,但是改了设置就不能收到数据了。想请高手指点一下,如何解决这个问题。只剩20分了,解决问题了就全拿去好了。
...全文
2133 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2006-10-16
  • 打赏
  • 举报
回复
要改协议,必须和外设同时改。

比较省事的办法是,采用轮询方式接收。发送后,关闭 MSComm 控件,更改协议,再进入接收。不过,在外设一端要做一些延时,因为更改协议并重新启动通讯是比较慢的。

如果用 API 函数来做就比较快,可以不用延时。但编码麻烦一些。
finallyperface 2006-10-16
  • 打赏
  • 举报
回复
我现在将他改为偶校验,发送接收,保证发送格式正确,有部分数据返回的值是正确的,这样的话就肯定了是因为上位机接收的数据和设定的格式不正确导致了显示的数据出错。请问有什么办法可以不管校验位,只接收数据;或者改了格式以后能收到数据。串口接收我使用时间驱动的,改用轮循能不能有所改进阿
finallyperface 2006-10-16
  • 打赏
  • 举报
回复
我从网上找了一个vb调用API的串口,发出数据后更改串口格式,同样也不能收到数据,有什么办法可以延时接收阿(只改上位机),等到数据格式改好了以后才接收,我急啊
finallyperface 2006-10-16
  • 打赏
  • 举报
回复
我现在有换了一种写法,如下:
Private Sub Timer2_Timer()
Dim OutByte(0) As Byte
Dim InByte() As Byte
Dim RevLen As Integer
Dim ss As String
Dim i As Integer
Timer2.Enabled = False
MyCom.Settings = "9600,M,8,1"
OutByte(0) = &H0
MyCom.Output = OutByte
MyCom.Settings = "9600,S,8,1"
InByte = MyCom.Input
For i = 0 To UBound(InByte)
ss = ss & Hex(InByte(i)) & " " '每收到6字节定义为一个字符串
Next i
If ss <> "" Then
List1.AddItem (ss) '添加收到的字符串到显示的表中
ss = "" '该字符串清空,供下次使用
End If
Timer2.Enabled = True '打开定时器
End Sub
定时周期为15
接收的数据的发收同步稍好点,但是6字节的数据很多时候只有5字节,出错的数据还是有不少的。改协议我是不指望了,希望有什么好办法可以解决
finallyperface 2006-10-16
  • 打赏
  • 举报
回复
因为有人原先用pb没改协议也能很好的工作,所以我要vb最好也能工作,现在我用过轮询,可以收到正确数据,但是极不稳定,有段时间连出来几个数据,有时好一会一个数据也出不来,而且数据时不时的还会出现3F,定时器的定时周期也和数据出现的频率有关。程序如下:
Private Sub Timer2_Timer()
Dim OutByte(0) As Byte
Dim InByte() As Byte
Dim RevLen As Integer
Dim ss As String
Dim i As Integer
Timer2.Enabled = False
MyCom.Settings = "9600,M,8,1"
OutByte(0) = &H0
MyCom.Output = OutByte
MyCom.Settings = "9600,S,8,1"
If MyCom.InBufferCount > 0 Then
RevLen = MyCom.InBufferCount
InByte = MyCom.Input
If RevLen = 6 Then
For i = 0 To UBound(InByte)
ss = ss & Hex(InByte(i)) & " " '每收到6字节定义为一个字符串
Next i
List1.AddItem (ss) '添加收到的字符串到显示的表中
ss = "" '该字符串清空,供下次使用
End If
End If
Timer2.Enabled = True '打开定时器
End Sub
我是第一次用轮询方法处理串口,不是很清楚应该的效果。定时器周期为50

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧