【问题标题】:VB.NET Serial Port reading HEX data and insert in the textboxVB.NET 串口读取 HEX 数据并插入到文本框中
【发布时间】:2017-09-20 09:47:57
【问题描述】:

我想从连接在我的一个 COM 端口上的 UHF RFID 阅读器读取数据,数据应该是十六进制的,并且必须是一个完整的十六进制,应该粘贴在我制作的 windows 窗体应用程序的文本框中在 VB.NET 中。

请帮助我,我是 VB.NET 编程的新手。我需要一个 vb.net 代码来完成这项任务:

我的代码:

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   For Each s In System.IO.Ports.SerialPort.GetPortNames() 
        ComboBox1.Items.Add(s)
    Next s

End Sub


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If ComboBox1.SelectedIndex = -1 Then
        MessageBox.Show("Please select a port")
        Exit Sub
    Else
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = IO.Ports.Parity.None
        SerialPort1.StopBits = IO.Ports.StopBits.One
        SerialPort1.PortName = ComboBox1.SelectedItem.ToString
        SerialPort1.Open()
    End If
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.ReadExisting()
        buffer = String.Concat(buffer, rcv)


        Dim hexVal As Integer
        hexVal = Convert.ToInt32(rcv, 16) '16 specifies the base

        txtReceived.Text = hexVal

    Catch ex As Exception
    End Try

End Sub

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

End Sub

结束类

【问题讨论】:

  • 很好的作业。不幸的是,我们不是编码服务。向我们展示您迄今为止的尝试。
  • 我说得对吗,您想将缓冲区转换为 ASCII 十六进制代码吗?
  • 我想接收十六进制而不是 ascii 但我的代码无法正常工作可能是我的代码有错误
  • 然后,您将不得不遍历字符串(提示:For Each c As Char in buffer,然后将每个字符转换为 ascii 代码并将 ascii 代码转换为十六进制。我认为这很简单。
  • 基本上,我想读取 RFID 卡的 HEX 并将此 HEX 粘贴到文本框中。仅此而已......虽然它看起来很简单,但我无法在 VB.NET 中做到这一点

标签: vb.net winforms rfid


【解决方案1】:

我明白你的问题..

一行

hexVal = Convert.ToInt32(c, 16) '16 specifies the base

正在尝试将字符转换为 int32,但该函数假设传入的值已经是十六进制,而您得到的答案完全错误。

顺便说一句,您的数据是 8 位二进制,而您的串行端口阅读器将每个 8 位读取为 char 类型。

你需要的是使用VB内置函数Hex,它接受一个整数/字节(在这种情况下是每个字符的ascii代码)并返回一个十六进制值作为字符串所以

Dim x As Integer = 15
Dim s As String = hex(x)

将“F”分配给字符串

一切顺利。但是,如果您想要一个 2 位的十六进制字符串,则需要检查返回的字符串是否只有一个字符,如果是,则在开头添加一个“0”。

那么,你的台词

Dim hexVal As Integer
hexVal = Convert.ToInt32(rcv, 16) '16 specifies the base
txtReceived.Text = hexVal

应该替换为..

Dim hexVal As string =""
For Each c As Char In rcv
    hexVal = heval & AsciiCharToHexSring(c)
Next
txtReceived.Text = hexVal

并添加此函数以转换字符并在必要时添加“0”..

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

如果您不需要每次都使用 2 位十六进制数字,只需删除 If..End If

【讨论】:

  • 现在,我的问题已经解决了 50%。我在文本框中得到了 HEX,但我还面临更多问题。我的代码如下:
  • 问题如下:
  • 1. SerialPort1.ReadLine 未从 UHF RFID 阅读器 2 读取任何数据。SerialPort1.ReadExisting() 正在从 UHF RFID 阅读器读取数据,但所有数据并未出现在单个文本框中,一些字节出现在第一个文本框中并保留在第二个文本框 3. 我制作了两个文本框 -> 一个用于 USER RFID TAG ID 和 -> 一个用于 BOOK RFID TAG ID
  • 4.当用户刷第一张 RFID 卡时,其完整的十六进制应插入第一个名为“txtReceived1”的文本框中,然后当用户刷另一张 RFID 卡时,其完整的十六进制应插入第二个名为“txtReceived2”的文本框中 5. 完整长度卡的 HEX 为 21 个字节,例如(CC FF FF 10 32 0D 01 E2 00 10 26 77 0D 01 51 23 30 23 55 2D),我想分别在第一个文本框和第二个文本框中分别读取用户标签 ID 和图书标签 ID 的文本框中的完整 20 个字节
  • 我面临的第二个主要问题是某些接收到的字节被更改(更改),尤其是前 3 个字节而不是接收(CC FF FF)实际接收到的数据是(3F 3F 3F),第 8 个字节每次也被改变而不是接收(E2)我的com端口正在接收(3F)同样是第19个字节的情况所以简而言之虽然数据正在接收但它的一些字节被改变
猜你喜欢
  • 1970-01-01
  • 2020-10-25
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多