Foxtable(狐表)用户栏目专家坐堂 → [求助]串口取值问题


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

主题:[求助]串口取值问题

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


加好友 发短信
等级:一尾狐 帖子:496 积分:4881 威望:0 精华:0 注册:2012/4/20 8:42:00
[求助]串口取值问题  发帖心情 Post By:2021/10/22 9:21:00 [只看该作者]

问题为:有时候会取不到串口发送来的数据
串口监视代码:
If Forms("称重打标").Opened Then
Forms("称重打标").Controls("显示数据").value = e.Port.ReadExisting().ToString().Trim().Replace("w", "").Replace("k", "").Replace(vbCrLf, "").Replace("g", "")
Threading.Thread.Sleep(500)
end if


称重打标窗口内按钮事件:
Ports(com1.Value).Write("R")
Dim 显示数据 As WinForm.TextBox = e.Form.Controls("显示数据")
 If 显示数据.Value = "" Then
                    msg("未接收到串口发来的数据,请重试.")
                    Return
End If
--其中,Threading.Thread.Sleep(500)这个如果取消,会报错。。

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


加好友 发短信
等级:一尾狐 帖子:496 积分:4881 威望:0 精华:0 注册:2012/4/20 8:42:00
  发帖心情 Post By:2021/10/22 9:23:00 [只看该作者]

但是,我直接用vb.net的代码。就不会报错。
以下是vb.net代码
Imports System.IO.Ports
Imports System.Text

Public Class Form1
    Private com As New SerialPort()
    '’BaseMainForm.Invoke(TDG,New object() {valarr}) '执行委托
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '初始化下拉串口名称列表框
        Dim ports As String() = SerialPort.GetPortNames()
        'Array.Sort(ports)
        For Each r As String In ports
            If ComboBox1.Items.Contains(r) = False Then
                ComboBox1.Items.Add(r)
            End If
        Next

        'ComboBox1.Items.AddRange(ports)
        AddHandler com.DataReceived, AddressOf Com_DataReceived
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If com.IsOpen Then com.Close()
        com.PortName = ComboBox1.Text
        com.BaudRate = 9600 ' 波特率
        com.Parity = Parity.None ' 无奇偶校验位
        com.StopBits = StopBits.One ' 两个停止位

        ' com.Handshake = Handshake.RequestToSend;//控制协议
        com.DataBits = 8
        ' com.ReceivedBytesThreshold = 13;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数,我这里是13字节为一组
        ' com.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);
        com.Open()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        com.Write("R")
    End Sub
    Private Sub Com_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs)
        Threading.Thread.Sleep(500)
        Dim readBuffer = New Byte(com.ReadBufferSize + 1 - 1) {}
        Dim count = com.Read(readBuffer, 0, com.ReadBufferSize)        ' 读取串口数据(监听)
        Dim SerialIn = Encoding.ASCII.GetString(readBuffer, 0, count) ' 将字节数组解码为字符串

        ' MessageBox.Show(SerialIn.Length)
        Invoke(Sub()
                   'Dim x() As String = SerialIn.Split(vbCrLf)
                   ''获取最后一个。
                   'System.IO.File.WriteAllText("1.txt", SerialIn)
                   'vars("重量") = SerialIn
                   'Dim m As String = x(x.Length - 1)
                   Dim m As String = SerialIn.Split(vbCrLf)(0)
                   RichTextBox1.Text = m
                   'MsgBox(x(0))
               End Sub)
        'RichTextBox1.Invoke(Invoke)
        'RichTextBox1.Text = SerialIn
    End Sub

End Class


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


加好友 发短信
等级:超级版主 帖子:107739 积分:548028 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/10/22 9:28:00 [只看该作者]

对方发过来的是字节还是字符?ReadExisting只能接收字符。

If Forms("称重打标").Opened Then
dim s as string = e.Port.ReadExisting()
msgbox(s.length) 使用日志记录一下接收的数据长度,是不会有隐藏的字符
  Forms("称重打标").Controls("显示数据").value = s.ToString().Trim().Replace("w", "").Replace("k", "").Replace(vbCrLf, "").Replace("g", "")
Threading.Thread.Sleep(500)
end if

另外确定对方发送成功了?是不是需要什么交互过程,比如先应答再接收

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


加好友 发短信
等级:一尾狐 帖子:496 积分:4881 威望:0 精华:0 注册:2012/4/20 8:42:00
  发帖心情 Post By:2021/10/22 9:30:00 [只看该作者]

发送的字符
两种方式我都用了。
 'Dim readBuffer = New Byte(e.Port.ReadBufferSize + 1 - 1) {}
            'Dim count = e.Port.Read(readBuffer, 0, e.Port.ReadBufferSize)        ' 读取串口数据(监听)
            'Dim SerialIn = Encoding.ASCII.GetString(readBuffer, 0, count) ' 将字节数组解码为字符串
是有时候能取值,有时候取不到。

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


加好友 发短信
等级:一尾狐 帖子:496 积分:4881 威望:0 精华:0 注册:2012/4/20 8:42:00
  发帖心情 Post By:2021/10/22 9:31:00 [只看该作者]

我用的下面的vb.net程序。没有任何问题。只要发送指令,都可以接收到数据。

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


加好友 发短信
等级:超级版主 帖子:107739 积分:548028 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/10/22 9:33:00 [只看该作者]

如果是这样,建议直接在vs里封装做好的功能给foxtable使用了。

主要是我们没有硬件,没有办法测试

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


加好友 发短信
等级:一尾狐 帖子:496 积分:4881 威望:0 精华:0 注册:2012/4/20 8:42:00
  发帖心情 Post By:2021/10/22 9:35:00 [只看该作者]

封装成dll文件?还是啥??这个窗口能封装成dll文件吗?

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


加好友 发短信
等级:超级版主 帖子:107739 积分:548028 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/10/22 9:41:00 [只看该作者]

vs里开发的任何东西都可以编译成dll给foxtable使用。注意vs里的项目要选.net4.0的

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


加好友 发短信
等级:一尾狐 帖子:496 积分:4881 威望:0 精华:0 注册:2012/4/20 8:42:00
  发帖心情 Post By:2021/10/22 9:45:00 [只看该作者]

好的。我试试


 回到顶部