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


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

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

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


加好友 发短信
等级:三尾狐 帖子:635 积分:6336 威望:0 精华:0 注册:2011/5/8 13:21:00
[求助]关于串口通讯不能同步的问题!  发帖心情 Post By:2017/11/30 17:47:00 [只看该作者]

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 = Ports("COM3").BytesToRead
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)



以上代码,执行后不能读取COM缓存区,需要单独执行读取!
如果分开执行,就不能保证获取到的数据是那个查询条件的!

数据格式如下:

01            03     00  00             00  01       84  0A
设备编号   读取  其实扇区             扇区数量       校验码 


返回值
01          03         02          01  03        F9   D5
设备编号  读取    数据长度     数据内容      校验码

希望寻找能够解决发送指令后直接读取的方法!

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


加好友 发短信
等级:三尾狐 帖子:635 积分:6336 威望:0 精华:0 注册:2011/5/8 13:21:00
  发帖心情 Post By:2017/11/30 17:51:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20171130175011.png
图片点击可在新窗口打开查看

这个是从串口调试助手中测试的效果!

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


加好友 发短信
等级:三尾狐 帖子:635 积分:6336 威望:0 精华:0 注册:2011/5/8 13:21:00
  发帖心情 Post By:2017/11/30 18:03:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20171130175011.png
图片点击可在新窗口打开查看

如果在串口监视器,就会出现一个命令多次接收的问题!

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | 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)


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


加好友 发短信
等级:三尾狐 帖子:635 积分:6336 威望:0 精华:0 注册:2011/5/8 13:21:00
  发帖心情 Post By:2017/11/30 19:03:00 [只看该作者]

第一,等待5秒肯定是不现实的,设备数据实时在变,COM口通讯应该是毫秒级的,这个应该是狐表的BUG
第二,给我的代码有BUG,还不如'System.Threading.Thread.Sleep(5000)来的实在

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

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


加好友 发短信
等级:三尾狐 帖子:635 积分:6336 威望:0 精华:0 注册:2011/5/8 13:21:00
  发帖心情 Post By:2017/11/30 20:51:00 [只看该作者]

以下是引用wangjian6931在2017/11/30 20:21:00的发言:
这里是一个坑。我被坑了好几天。希望你早日出来。

兄弟,把你的思路分析一下呗


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


加好友 发短信
等级:三尾狐 帖子:635 积分:6336 威望:0 精华:0 注册:2011/5/8 13:21:00
  发帖心情 Post By:2017/11/30 21:33:00 [只看该作者]

@有点甜 老师,给个思路吧,这个思路行不通的

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | 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、代码执行有什么问题?效果是怎样的?


 回到顶部
美女呀,离线,留言给我吧!
wayiok
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:71 积分:716 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 11:24:00 [只看该作者]

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

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

 回到顶部
美女呀,离线,留言给我吧!
wayiok
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:71 积分:716 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 11:27:00 [只看该作者]

接收效果如截图~~  加不上图片......
[此贴子已经被作者于2018/8/13 11:28:57编辑过]

 回到顶部
总数 18 1 2 下一页