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


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

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

帅哥哟,离线,有人找我吗?
有点甜
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | 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编辑过]

 

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


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


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


加好友 发短信
等级:幼狐 帖子:69 积分:689 威望: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)


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


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

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

 

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


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


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


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

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


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


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

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

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


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