【问题标题】:How to read a single character from a com port如何从 com 端口读取单个字符
【发布时间】:2021-05-20 21:55:23
【问题描述】:

感谢您查看我的问题。我正在尝试从 COM 端口读取数据。我有一个启动板微控制器,我已经完成了,所以我可以向它发送单字符代码并让微控制器做出相应的响应。这是当前的应用程序:

Current Application

目前,我可以根据自己的心意来制作图钉的高低。但是,我想从控制器读取引脚值。我创建了一个子程序,它打开 com 端口并发送导致 a 引脚变为 highlow 的字符。

微控制器上的代码已设置,因此如果它收到“T”字符,它会立即发送回单个字符。如何从 com 端口检索这个单个字符?

我是 vb.net 的新手,所以要温柔。代码如下供参考。我使用 sendCom() 函数打开和关闭 com 端口以发送数据。我想要一个 readCom() 函数,如果可能的话,它会抓住我的角色。

感谢您查看我的困境。

~特里斯顿

/------------------------ 参考代码-------- ------------------------------------------

Public Class Form1
Dim myBtn0 As Boolean
Dim myBtn1 As Boolean
Dim myBtn2 As Boolean
Dim myBtn3 As Boolean
Dim myBtn4 As Boolean
Dim myBtn5 As Boolean
Dim myBtn6 As Boolean
Dim myBtn7 As Boolean


Function sendCom(ByVal Data As Char)
    Dim myCom As System.IO.Ports.SerialPort
    myCom = My.Computer.Ports.OpenSerialPort("COM6", 9600, 0, 8)

    myCom.Write(Data)
    myCom.Close()
    myCom.Dispose()
End Function


Function pinFlip(ByVal pinNum As Integer, ByVal pState As Boolean) As Integer
    InfoBox.Clear()
    InfoBox.Multiline = True
    Select Case pinNum
        Case 0
            If pState Then
                InfoBox.AppendText("C" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("c" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
        Case 1
            If pState Then
                InfoBox.AppendText("D" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("d" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
        Case 2
            If pState Then
                InfoBox.AppendText("E" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("e" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
        Case 3
            If pState Then
                InfoBox.AppendText("F" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("f" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
        Case 4
            If pState Then
                InfoBox.AppendText("G" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("g" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
        Case 5
            If pState Then
                InfoBox.AppendText("H" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("h" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
        Case 6
            If pState Then
                InfoBox.AppendText("I" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("i" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
        Case 7
            If pState Then
                InfoBox.AppendText("J" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            Else
                InfoBox.AppendText("j" + Environment.NewLine)
                InfoBox.ScrollToCaret()
            End If
    End Select

End Function
Private Sub GetPorts_Click(sender As Object, e As EventArgs) Handles GetPorts.Click
    ' Show all available COM ports.
    ListBox1.Items.Clear()
    For Each sp As String In My.Computer.Ports.SerialPortNames
        ListBox1.Items.Add(sp)
    Next
End Sub

Private Sub Send_Click(sender As Object, e As EventArgs) Handles Send.Click

    Dim Data As Char
    'Dim Com6 As System.IO.Ports.SerialPort
    'Com6 = My.Computer.Ports.OpenSerialPort("COM5", 9600, 0, 8)
    Data = "A"
    'Com6.Open()

    'System.Threading.Thread.Sleep(200)
    'Com6.Write(Data)
    'System.Threading.Thread.Sleep(200)
    'Com6.Close()
    'System.Threading.Thread.Sleep(200)
    'Com6.Dispose()
    sendCom(Data)
    P0.BackColor = Color.Green
    P1.BackColor = Color.Green
    P2.BackColor = Color.Green
    P3.BackColor = Color.Green
    P4.BackColor = Color.Green
    P5.BackColor = Color.Green
    P6.BackColor = Color.Green
    P7.BackColor = Color.Green

    myBtn0 = True
    myBtn1 = True
    myBtn2 = True
    myBtn3 = True
    myBtn4 = True
    myBtn5 = True
    myBtn6 = True
    myBtn7 = True

    InfoBox.Clear()
    InfoBox.Multiline = True
    InfoBox.AppendText("All Set High" + Environment.NewLine)
    InfoBox.ScrollToCaret()
End Sub

Private Sub SendB_Click(sender As Object, e As EventArgs) Handles SendB.Click
    Dim Data As Char
    'Dim Com6 As System.IO.Ports.SerialPort
    'Com6 = My.Computer.Ports.OpenSerialPort("COM5", 9600, 0, 8)
    'Com6.Open()
    Data = "B"
    ' Send strings to a serial port.
    'System.Threading.Thread.Sleep(200)
    'Com6.Write(Data)
    'System.Threading.Thread.Sleep(200)
    'Com6.Close()
    'System.Threading.Thread.Sleep(200)
    'Com6.Dispose()
    sendCom(Data)
    P0.BackColor = Color.Red
    P1.BackColor = Color.Red
    P2.BackColor = Color.Red
    P3.BackColor = Color.Red
    P4.BackColor = Color.Red
    P5.BackColor = Color.Red
    P6.BackColor = Color.Red
    P7.BackColor = Color.Red

    myBtn0 = False
    myBtn1 = False
    myBtn2 = False
    myBtn3 = False
    myBtn4 = False
    myBtn5 = False
    myBtn6 = False
    myBtn7 = False

    InfoBox.Clear()
    InfoBox.Multiline = True
    InfoBox.AppendText("All Set Low" + Environment.NewLine)
    InfoBox.ScrollToCaret()
End Sub
Private Sub myRead_Click(sender As Object, e As EventArgs) Handles myRead.Click
    InfoBox.Clear()
    InfoBox.Multiline = True
    InfoBox.AppendText("The READ!" + Environment.NewLine)
    InfoBox.ScrollToCaret()
End Sub
Private Sub PortInfo_Click(sender As Object, e As EventArgs) Handles PortInfo.Click
    Dim Com6 As System.IO.Ports.SerialPort
    Dim myData As String
    InfoBox.Clear()
    InfoBox.Multiline = True
    Com6 = My.Computer.Ports.OpenSerialPort("COM6", 9600, 0, 8)
    myData = "Port Name: " + CStr(Com6.PortName)
    InfoBox.AppendText(myData + Environment.NewLine)
    InfoBox.ScrollToCaret()
    myData = "BaudRate: " + CStr(Com6.BaudRate)
    InfoBox.AppendText(myData + Environment.NewLine)
    InfoBox.ScrollToCaret()
    myData = "Parity: " + CStr(Com6.Parity)
    InfoBox.AppendText(myData + Environment.NewLine)
    InfoBox.ScrollToCaret()
    myData = "Data Width: " + CStr(Com6.DataBits)
    InfoBox.AppendText(myData + Environment.NewLine)
    InfoBox.ScrollToCaret()
    myData = "Stop Bits: " + CStr(Com6.StopBits)
    InfoBox.AppendText(myData + Environment.NewLine)
    InfoBox.ScrollToCaret()
    Com6.Dispose()

End Sub

Private Sub Btn0_Click(sender As Object, e As EventArgs) Handles Btn0.Click
    Select Case myBtn0
        Case False
            P0.BackColor = Color.Green
            myBtn0 = True
            sendCom("C")
        Case True
            P0.BackColor = Color.Red
            myBtn0 = False
            sendCom("K")
    End Select

    pinFlip(0, myBtn0)
End Sub

Private Sub Btn1_Click(sender As Object, e As EventArgs) Handles Btn1.Click
    Select Case myBtn1
        Case False
            P1.BackColor = Color.Green
            myBtn1 = True
            sendCom("D")
        Case True
            P1.BackColor = Color.Red
            myBtn1 = False
            sendCom("L")
    End Select
    pinFlip(1, myBtn1)
End Sub

Private Sub Btn2_Click(sender As Object, e As EventArgs) Handles Btn2.Click
    Select Case myBtn2
        Case False
            P2.BackColor = Color.Green
            myBtn2 = True
            sendCom("E")
        Case True
            P2.BackColor = Color.Red
            myBtn2 = False
            sendCom("M")
    End Select
    pinFlip(2, myBtn2)
End Sub

Private Sub Btn3_Click(sender As Object, e As EventArgs) Handles Btn3.Click
    Select Case myBtn3
        Case False
            P3.BackColor = Color.Green
            myBtn3 = True
            sendCom("F")
        Case True
            P3.BackColor = Color.Red
            myBtn3 = False
            sendCom("N")
    End Select
    pinFlip(3, myBtn3)
End Sub

Private Sub Btn4_Click(sender As Object, e As EventArgs) Handles Btn4.Click
    Select Case myBtn4
        Case False
            P4.BackColor = Color.Green
            myBtn4 = True
            sendCom("G")
        Case True
            P4.BackColor = Color.Red
            myBtn4 = False
            sendCom("O")
    End Select
    pinFlip(4, myBtn4)
End Sub

Private Sub Btn5_Click(sender As Object, e As EventArgs) Handles Btn5.Click
    Select Case myBtn5
        Case False
            P5.BackColor = Color.Green
            myBtn5 = True
            sendCom("H")
        Case True
            P5.BackColor = Color.Red
            myBtn5 = False
            sendCom("P")
    End Select
    pinFlip(5, myBtn5)
End Sub

Private Sub Btn6_Click(sender As Object, e As EventArgs) Handles Btn6.Click
    Select Case myBtn6
        Case False
            P6.BackColor = Color.Green
            myBtn6 = True
            sendCom("I")
        Case True
            P6.BackColor = Color.Red
            myBtn6 = False
            sendCom("Q")
    End Select
    pinFlip(6, myBtn6)
End Sub

Private Sub Btn7_Click(sender As Object, e As EventArgs) Handles Btn7.Click
    Select Case myBtn7
        Case False
            P7.BackColor = Color.Green
            myBtn7 = True
            sendCom("J")
        Case True
            P7.BackColor = Color.Red
            myBtn7 = False
            sendCom("R")
    End Select
    pinFlip(7, myBtn7)
End Sub

结束类

【问题讨论】:

  • 那里有一大堆代码,似乎没有什么与尝试从串行端口读取数据相关。也许从官方文档开始,它有一个相当不错的例子,关于从串行端口读取/写入和处理事件docs.microsoft.com/en-us/dotnet/api/…

标签: vb.net serial-port port msp430


【解决方案1】:

您的函数sendCom(ByVal Data As Char) 打开 COM 端口,然后发送数据,然后关闭它,从不保持打开状态以接收数据。如果您想轮询接收到的数据并在没有数据时超时,这很好。请参阅example here 了解您需要添加到代码中的接收功能。

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多