以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]串口取值问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=172616)

--  作者:baicaocao
--  发布时间: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
--  发布时间: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


--  作者:有点蓝
--  发布时间: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
--  发布时间: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
--  发布时间:2021/10/22 9:31:00
--  
我用的下面的vb.net程序。没有任何问题。只要发送指令,都可以接收到数据。
--  作者:有点蓝
--  发布时间:2021/10/22 9:33:00
--  
如果是这样,建议直接在vs里封装做好的功能给foxtable使用了。

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

--  作者:baicaocao
--  发布时间:2021/10/22 9:35:00
--  
封装成dll文件?还是啥??这个窗口能封装成dll文件吗?
--  作者:有点蓝
--  发布时间:2021/10/22 9:41:00
--  
vs里开发的任何东西都可以编译成dll给foxtable使用。注意vs里的项目要选.net4.0的
--  作者:baicaocao
--  发布时间:2021/10/22 9:45:00
--  
好的。我试试