Foxtable(狐表)用户栏目专家坐堂 → [求助]关于串口通讯不能同步的问题!


  共有3415人关注过本帖树形打印复制链接

主题:[求助]关于串口通讯不能同步的问题!

帅哥哟,离线,有人找我吗?
有点甜
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/11/30 18:32:00 [显示全部帖子]

等候呗,等5秒,直到读取到数据,如果是多次接收的问题,你可以判断接收的字符长度嘛。

 

Ports.Add("COM3")
With Ports("COM3")
    .Close()
    .Parity = Parity.None
    .Handshake = Handshake.None
    .StopBits = StopBits.One
    .BaudRate = 9600
    .DataBits = 8
    .ReadBufferSize() = 4096
    .WriteBufferSize() = 2048
    .Open
End With
Dim b_sent() As Byte = {&H01, &H03, &H00, &H00, &H00, &H01, &H84, &H0A}
Ports("COM3").Write(b_sent, 0, b_sent.length)
Dim s As String
Dim s1 As String

Dim cnt As Integer = 0
Dim sdt As Date = Date.Now
Do While Date.Now < sdt.AddSeconds(5) '等到5秒
    cnt = Ports("COM3").BytesToRead
    If cnt > 0 Then Exit Do '或者读取到数据
    application.doevents
Loop

If cnt > 0 Then '缓冲区是否有数据
    Dim Val(cnt - 1) As Byte
    Ports("COM3").Read(val,0,cnt)
    Dim i As Integer
    For i = 0 To cnt-1
        s1 = Val(i)
        If s1.Length = 1 Then
            s = s & 0 & DecToHex(Val(i))
        Else
            s = s & DecToHex(Val(i))
        End If
    Next
End If
Output.Show(s)


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/11/30 21:40:00 [显示全部帖子]

以下是引用lhpc120在2017/11/30 19:03:00的发言:
第一,等待5秒肯定是不现实的,设备数据实时在变,COM口通讯应该是毫秒级的,这个应该是狐表的BUG
第二,给我的代码有BUG,还不如'System.Threading.Thread.Sleep(5000)来的实在

这个不能即时读取COM的问题我认为是一个很严重的问题,不管读取字符串还是字节,都存在这种问题

 

1、认认真真看代码,最多5秒,如果读取到数据,里面就退出循环了啊

 

Dim cnt As Integer = 0
Dim sdt As Date = Date.Now
Do While Date.Now < sdt.AddSeconds(5) '等到5秒
    cnt = Ports("COM3").BytesToRead
    If cnt > 0 Then Exit Do '或者读取到数据
    application.doevents
Loop

 

2、代码执行有什么问题?效果是怎样的?


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/8/13 11:59:00 [显示全部帖子]

以下是引用wayiok在2018/8/13 11:24:00的发言:
有点甜老师,我也遇到了和这个帖子一样的问题。加上上述等待代码,还是会出现串口监视器一次发送命令多次接收的问题。而且接收次数似乎没有什么规律性,有时1次,有时2次。

[此贴子已经被作者于2018/8/13 11:24:04编辑过]

 

关键是判断是否找到结束符号。接收多少次都没问题,遇到命令结束符之后才算是一次完整的接收。


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/8/13 17:37:00 [显示全部帖子]

1、你接收的数据,有没有开始结束符?

 

2、比如以某字符结束,或者固定长度的数据。都可以处理。读取到结束字符以后,再执行addnew的代码,否则,把字符保存给一个变量,等等下次进入事件。


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/8/13 18:58:00 [显示全部帖子]

以下是引用wayiok在2018/8/13 18:09:00的发言:
执行addnew的代码,否则,把字符保存给一个变量,等等下次进入事件。-------懂了,谢谢!!!

 

指令长度固定的话,那就直接判断cnt的值咯。

 

比如cnt<4的时候,把信息记录起来,直到信息等于4或大于4


 回到顶部