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


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

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

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


加好友 发短信
等级:幼狐 帖子:70 积分:705 威望: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:70 积分:705 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 11:27:00 [显示全部帖子]

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

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


加好友 发短信
等级:幼狐 帖子:70 积分:705 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 17:07:00 [显示全部帖子]

现在串口 DataReceived中的程序如下,第一行接收大半次数据,第二行接收小半次数据。请老师帮忙看看应该怎么修改,使接收的数据放在同一行上?

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("COM1").BytesToRead
    If cnt > 0 Then Exit Do '或者读取到数据
    application.doevents
Loop

'Dim cnt As Integer = e.Port.BytesToRead
If cnt > 0 Then '缓冲区是否有数据
    Dim Val(cnt - 1) As Byte
    e.Port.Read(val,0,cnt)
    Dim i As Integer
    For i = 0 To cnt-1
 '   s1 = Val(i)
s1 = DecToHex(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)
'msgbox(s)

        Dim r As Row = Tables("表A").AddNew()
        r("第一列") = s
        r("第二列") = Date.Now
        r.Save()

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


加好友 发短信
等级:幼狐 帖子:70 积分:705 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 17:09:00 [显示全部帖子]

发送部分的代码如下:

Ports.Add("COM1")
Ports("COM1").Close
With Ports("COM1")
    .Close()
    .Parity = Parity.None
    .Handshake = Handshake.None
    .StopBits = StopBits.One
    .BaudRate = 9600
    .DataBits = 8
    .ReadBufferSize() = 8192  ' 4096
    .WriteBufferSize() = 2048
    .Open
End With
Ports("COM1").Open()

Dim Val() As Byte = New Byte() {&H01,&H03,&H00,&H03,&H00,&H02,&H34,&H0B}
Ports("COM1").Write(Val, 0, Val.Length)


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


加好友 发短信
等级:幼狐 帖子:70 积分:705 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 17:45:00 [显示全部帖子]

发送的数据是01 03 0003 0002 340B
接收的数据是01 03 04 0BC9 0125 E862,有时接收的是0103040BC90125E862在同一行,有时接收的是第一行0103040BC90125E862,第二行62

发送的数据意思是:01设备地址,03读取功能码,0003表示要读的起始地址,0002表示要读2个寄存器,340B是CRC16校验码
接收的数据意思是:01设备地址,03读取功能码,04表示读的数据长度是4个字节,0BC9 0125读到的值,E862是CRC16校验码



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


加好友 发短信
等级:幼狐 帖子:70 积分:705 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 17:59:00 [显示全部帖子]

接收的数据,没有固定的结束字符。如果以固定长度数据该怎么改?我在addnew代码前面加了一句msgbox(cnt),但是显示的不是18,而是‘8’-“确定”-‘1’-“确定”-‘9’,每次都要按“确定”.


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


加好友 发短信
等级:幼狐 帖子:70 积分:705 威望:0 精华:0 注册:2012/10/9 13:40:00
  发帖心情 Post By:2018/8/13 18:09:00 [显示全部帖子]

执行addnew的代码,否则,把字符保存给一个变量,等等下次进入事件。-------懂了,谢谢!!!

 回到顶部