以文本方式查看主题
- Foxtable(狐表) (http://foxtable.net/bbs/index.asp)
-- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2)
---- [求助]关于串口通讯不能同步的问题! (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=110311)
|
-- 作者:lhpc120
-- 发布时间: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
-- 发布时间:2017/11/30 17:51:00
--
此主题相关图片如下:qq截图20171130175011.png
这个是从串口调试助手中测试的效果!
|
-- 作者:lhpc120
-- 发布时间:2017/11/30 18:03:00
--
此主题相关图片如下:qq截图20171130175011.png
如果在串口监视器,就会出现一个命令多次接收的问题!
|
-- 作者:有点甜
-- 发布时间: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
-- 发布时间:2017/11/30 19:03:00
--
第一,等待5秒肯定是不现实的,设备数据实时在变,COM口通讯应该是毫秒级的,这个应该是狐表的BUG 第二,给我的代码有BUG,还不如\'System.Threading.Thread.Sleep(5000)来的实在
这个不能即时读取COM的问题我认为是一个很严重的问题,不管读取字符串还是字节,都存在这种问题
|
-- 作者:lhpc120
-- 发布时间:2017/11/30 20:51:00
--
以下是引用wangjian6931在2017/11/30 20:21:00的发言:
这里是一个坑。我被坑了好几天。希望你早日出来。
兄弟,把你的思路分析一下呗
|
-- 作者:lhpc120
-- 发布时间:2017/11/30 21:33:00
--
@有点甜 老师,给个思路吧,这个思路行不通的
|
-- 作者:有点甜
-- 发布时间: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
-- 发布时间:2018/8/13 11:24:00
--
有点甜老师,我也遇到了和这个帖子一样的问题。加上上述等待代码,还是会出现串口监视器一次发送命令多次接收的问题。而且接收次数似乎没有什么规律性,有时1次,有时2次。
[此贴子已经被作者于2018/8/13 11:24:04编辑过]
|
-- 作者:wayiok
-- 发布时间:2018/8/13 11:27:00
--
接收效果如截图~~ 加不上图片......
[此贴子已经被作者于2018/8/13 11:28:57编辑过]
|