串行端口读取的数量少于所需的20个字节

时间:2017-09-30 14:36:57

标签: .net vb.net winforms serial-port rfid

在下图中,我使用 UHF阅读器软件来测试RFID卡。我自己的文本框中的最终结果应该是 RFID卡的唯一12字节HEX

implemented

基本上,我正在开发图书馆管理系统(LMS)项目,我正在尝试使用用户身份 HEX中的用户RFID标签来发行图书)和图书标识在HEX中预订RFID标签)。

当用户进入图书馆发行图书并且他/她刷他/她的RFID卡时,HEX中的他/她的用户ID(12字节)应出现在第一个文本框中。之后,用户将扫描他/她想要发布的书,结果书签ID(12字节)将在第二个文本框中显示为HEX(阅读器的输出 20字节< / strong>如上图所示。

现在我遇到的问题是:

调用SerialPort1.ReadExisting()方法时,我没有在第一个文本框中收到所有20个字节的HEX。一些字节出现在第一个文本框中,其余字节出现在第二个文本框中。造成这种情况的原因是什么?

在下面的图片中,您可以看到我得到的输出:

image 1

我也试过调用SerialPort1.ReadLine(),但它没有返回任何数据。

我希望这20个字节(如上图所示)显示在第一个文本框中,因为这是20字节用户RFID 。然后,当扫描书籍时,它应该通过串口读取接下来的20个字节(书签RFID )并将它们插入第二个文本框中。

我的代码如下:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    SerialPort1.BaudRate = 9600
    SerialPort1.DataBits = 8
    SerialPort1.Parity = IO.Ports.Parity.None
    SerialPort1.StopBits = IO.Ports.StopBits.One
    SerialPort1.Handshake = Handshake.None
    SerialPort1.PortName = "Com7"

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SerialPort1.Open()
End Sub

Private Shared buffer As String = ""

Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

    Try

        'Dim rcv As String = SerialPort1.ReadLine
        'Dim rcv As String = SerialPort1.ReadByte
        Dim rcv As String = _SerialPort1.ReadExisting()  

        buffer = String.Concat(buffer, rcv)


        Dim hexVal As String = ""
        For Each c As Char In rcv
            hexVal = hexVal & AsciiCharToHexSring(c)
        Next

        If txtReceived1.Text = "" Then
            txtReceived1.Text = hexVal

        ElseIf txtReceived2.Text = "" Then
            txtReceived2.Text = hexVal

        Else
            txtReceived1.Text = ""
            txtReceived2.Text = ""
        End If

    Catch ex As Exception
    End Try

End Sub

Private Function AsciiCharToHexSring(s As Char) As String
    Dim hexdigit As String = Hex(Asc(s))
    If hexdigit.Length = 1 Then
        hexdigit = "0" & hexdigit
    End If
    Return hexdigit
End Function

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    SerialPort1.Close()

    txtReceived1.Text = ""
    txtReceived2.Text = ""
End Sub

1 个答案:

答案 0 :(得分:-1)

尝试使用有形软件解决方案的免费C ++到VB.NET converter获取小代码片段。

仅供参考 - 我尝试转换你的代码,并在转换后的代码中出现了一个Copywritten字符串函数(在VB.NET中),这是由Tangible开发的。字符串函数的注释表明,Tangible最初提供了基于经典C字符串函数的即用型VB.NET函数,这些函数不容易转换为VB.NET。