【问题标题】:How to put received serial text into multiple text boxes?如何将接收到的串行文本放入多个文本框中?
【发布时间】:2016-07-12 23:22:02
【问题描述】:

我正在做一个串行通信项目,并希望根据单击哪个按钮将接收到的字符串放入文本框中以发送初始字符串并调用响应。

ReceivedText 的代码是:

PrivateSub ReceivedText(ByVal [text] As String)

   Button1.Clear()
   Button2.Clear()

   If Button1.InvokeRequired Then
       RichTextBox1.text = [text].Trim("!")
   End If

   If Button2.InvokeRequired Then
       RichTextBox2.Text = [text].Trim("!")
   End If

EndSub

这只会导致接收到的字符串进入两个框而不是其中一个。

有什么方法可以让文本进入相应的框中?

【问题讨论】:

  • 你的 Clear 方法应该做什么?这不是标准按钮类型的成员。不过,如果您无法从响应文本中区分出哪个按钮被按下,那么我至少会看到几个选项。最简单的是保存点击了哪个按钮的公共变量。
  • 但是,如果您可以同时按下两个按钮或在从先前命令读取响应之前按下这两个按钮,则该操作将不起作用。如果这是一个要求,那么您将为每次按下按钮启动一个线程,并传入一个包含按钮名称和命令的类,就像stackoverflow.com/questions/30162382/… 接受的答案一样,这样您就可以在完成时读回名称。
  • @topshot 我更正了 Clear 方法并将其放在适当的行中。我对此很陌生,对线程不熟悉,你可以提供一个例子吗?我想根据单击的按钮将接收到的字符串放在某个位置是相当简单的......
  • 查看我上面第二条评论中的链接,了解有人如何将参数传递给线程。至于线程教程、MSDN 文档或在 VBForums.com 的 VB.Net CodeBank 部分中查找一些线程帖子(特别是 jmcilhinney 或 Niya 的帖子)
  • @topshot 除了清除功能之外,是什么阻止了文本进入正确的框?我不明白该代码的哪一部分会要求将文本放入两个框中

标签: vb.net serial-port serial-communication rs485


【解决方案1】:

要记住的关键是 .Net 将所有串行通信视为线程。让我举一个简单的例子,从我的一个从秤读取数据的程序中更新文本框。

Private Sub ComScale_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles ComScale.DataReceived

    If ComScale.IsOpen Then
        Try
            ' read entire string until .Newline 
            readScaleBuffer = ComScale.ReadLine()

            'data to UI thread because you can't update the GUI here
            Me.BeginInvoke(New EventHandler(AddressOf DoScaleUpdate))

        Catch ex As Exception : err(ex.ToString)

        End Try
    End If
End Sub

您会注意到调用了一个执行 GUI 内容的例程 DoScaleUpdate:

Public Sub DoScaleUpdate(ByVal sender As Object, ByVal e As System.EventArgs)
    Try
        'getAveryWgt just parses what was read into something like this {"20.90", "LB", "GROSS"}
        Dim rst() As String = getAveryWgt(readScaleBuffer)
        txtWgt.Text = rst(0)
        txtUom.Text = rst(1)
        txttype.Text = rst(2)
    Catch ex As Exception : err(ex.ToString)

    End Try
End Sub

如果您选择,您可以让它变得更复杂(请参阅 this thread 的第 15 篇文章作为示例),但这应该足以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多