以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]串口取值问题 (http://foxtable.com/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 -- 好的。我试试 |