使用VB发送十六进制命令 [英] Sending hex commands using VB

查看:145
本文介绍了使用VB发送十六进制命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  Imports  System.ComponentModel 
Imports System。线程
Imports System.IO.Ports

Public frmMain


Dim myPort 作为数组'COM端口检测到 ,系统将存储在此处
代表 Sub SetTextCallback( ByVal [text] As 字符串)'添加 可防止在接收期间发生线程错误数据

私有 Sub frmMain_Load( ByVal sender As System。 Object ByVal e As System.EventArgs)句柄 MyBase .Load

'当我们的表单加载时,自动检测所有串口 系统填充cmbPort组合框。

myPort = IO.Ports.SerialPort.GetPortNames()'获取所有可用的com端口
cmbBaud.Items.Add( 9600 )'填充cmbBaud组合框 使用的常用波特率

cmbBaud.Items.Add( 19200
cmbBaud.Items.Add( 38400
cmbBaud.Items.Add( 57600


对于 i = 0 UBound(myPort)
cmbPort.Items.Add(myPort(i))
下一步
cmbPort.Text = cmbPort.Items.Item( 0 )'将cmbPort文本设置为检测到第一个COM端口
cmbBaud.Text = cmbBaud.Items.Item( 0 )'设置cmbBaud文本 第一个波特率 on 列表

btnDisconnect.Enabled = False '最初断开连接按钮 已停用

结束 Sub





私有 Sub btnConnect_Click ( ByVal sender As System。 Object ByVal e As System.EventArgs)句柄 btnConnect.Click
SerialPort1.PortName = cmbPort.Text'在启动时将SerialPort1 设置为所选的COM端口
SerialPort1.BaudRate = cmbBaud.Text'将波特率设置为所选值 列表

'其他串行端口属性
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports。 StopBits.One
SerialPort1.DataBits = 8 '打开我们的串口
SerialPort1.Open()

btnConnect。 Enabled = False '禁用连接按钮
btnDisconnect.Enabled = True '并启用断开连接按钮

结束 Sub





私人 Sub btnDisconnect_Click( ByVal sender As System。 Object ByVal e As System.EventArgs)句柄 btnDi sconnect.Click
SerialPort1.Close()'关闭我们的串口

btnConnect.Enabled =
btnDisconnect。已启用= 错误
结束 Sub




私人 Sub btnSend_Click( ByVal sender As System。 Object ByVal e As System.EventArgs) Handles btnSend.Click
SerialPort1.Write(txtTransmit.Text& vbCr)'包含的文本 txtText将发送 串口 as ascii
'加上car return (回车键)car return 可以省略如果其他 end 需要它
结束 Sub




私有 Sub SerialPort1_DataReceived( ByVal 发​​件人作为 对象 ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)句柄 SerialPort1.DataReceiv每次在serialPort
结束 Sub
私有 Sub ReceivedText( ByVal [text] As String
'比较 创建Thread ID 调用线程
如果 Me .rtbReceived.InvokeRequired 然后
Dim x 作为 SetTextCallback( AddressOf ReceivedText)
.Invoke(x, 对象(){(文本)})
其他
.rtbReceived.Text& = [文字]
结束 如果
结束 Sub




私人 Sub cmbPort_SelectedIndexChanged( ByVal sender As 系统。对象 ByVal e As System.EventArgs)句柄 cmbPort.SelectedIndexChanged
如果 SerialPort1.IsOpen = 错误 然后
SerialPort 1.PortName = cmbPort.Text'弹出一个消息框 user if 更改端口
否则'而不先断开连接。
MsgBox( 仅在端口关闭时有效,vbCritical)
< span class =code-keyword>结束 如果
结束 Sub




私有 Sub cmbBaud_SelectedIndexChanged( ByVal sender As System。 Object ByVal e As System.EventArgs)< span class =code-keyword>句柄 cmbBaud.SelectedIndexChanged
如果 SerialPort1.IsOpen = False 然后
SerialPort1.BaudRate = cmbBaud.Text'弹出一个消息框 user 如果 更改波特率
其他'而不先断开连接。
MsgBox( 仅在端口关闭时有效,vbCritical)
< span class =code-keyword>结束 如果
结束 Sub

结束





我如何制作它只能发送和接收十六进制??



谢谢



我尝试过:



 私有  Sub  btnConnect_Click( ByVal 发​​件人作为系统。对象 ByVal  e  As  System.EventArgs)句柄 btnConnect.Click 
SerialPort1.PortName = cmbPor t.Text'在启动时'将SerialPort1 设置为所选的COM端口
SerialPort1.BaudRate = cmbBaud。 Integer '设置波特率 所选值 列表

'其他串行端口属性
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.DataBits = 8 '打开我们的串口
SerialPort1.Open()

btnConnect.Enabled = False '禁用连接按钮
btnDisconnect.Enabled = True '并启用断开按钮

结束 Sub



无效的强制转换是出现未处理的消息,从字符串转换为类型i nteger无效

解决方案

无效Cast异常未处理,从字符串到类型整数的转换无效



非常清楚 - 这是你从COmbo Box获得的文本值 - 所以你可以;只需将它分配给一个整数。改为转换它:

 SerialPort1.BaudRate = 整数 .Parse(cmbBaud.Text)


不发布您的整个应用程序,因为没有人会阅读所有内容。并且不需要。

只发布你的问题部分。



女巫就像OriginalGriff已经提到你给一个字符串到一个属性女巫等待一个整数。



你最好把你的项目放到 Option Strict ON

所以Visual Studio在编写这段代码时已经向您显示该错误。



作为简单的解决方案,您只需告诉 Integer.Parse String表示十六进制值的函数



 SerialPort1.BaudRate = 整数 .Parse(cmbBaud.Text,System.Globalization.NumberStyles.HexNumber)



//编辑:这对你的代码来说是错误的!





更新:

错误1

如果我将其更改为< pre lang =VB> Dim myPort As String ()= IO.Ports.SerialPor t.GetPortNames()' 获取所有可用的COM端口



它对我有用。

刚看到你定义它作为数组最好不要这样做。将它定义为作为String()并将其定义为本地,因为它不会在别处使用



而不是对于循环,您只需使用

 cmbPort.Items.AddRange(myPort)
' 这里选择第一个元素。
cmbPort.SelectedIndex = 0
cmbBaud.SelectedIndex = 0





错误2

好​​吧很简单,签名不匹配

文本作为字节VS文本作为字符串

你需要改变一,方法或代表



重要 ..还有另一个问题

看看串行端口 - 维基百科,免费的百科全书 [ ^ ]

9600, 19200,38400等等..已经是整数..如果我正确阅读你的程序那就没有HEX了。

只有选择9600(十六进制)才能工作,因为这是38400(十进制),这是一个有效的端口速度。无需用16进行解析..

只需

 SerialPort1.BaudRate = 整数 .Parse(cmbBaud.Text)

像OriginalGriff说的是正确答案

您发布的代码中没有HEX!我认为你错了!


Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports

Public Class frmMain

   
Dim myPort As Array           ‘COM Ports detected on the system will be stored here
Delegate Sub SetTextCallback(ByVal [text] As String)     ‘Added to prevent threading errors during receiveing of data

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

‘When our form loads, auto detect all serial ports in the system and populate the cmbPort Combo box.

myPort = IO.Ports.SerialPort.GetPortNames() ‘Get all com ports available
cmbBaud.Items.Add(9600)     ‘Populate the cmbBaud Combo box to common baud rates used

cmbBaud.Items.Add(19200)
cmbBaud.Items.Add(38400)
cmbBaud.Items.Add(57600)


For i = 0 To UBound(myPort)
cmbPort.Items.Add(myPort(i))
Next
cmbPort.Text = cmbPort.Items.Item(0)    ‘Set cmbPort text to the first COM port detected
cmbBaud.Text = cmbBaud.Items.Item(0)    ‘Set cmbBaud text to the first Baud rate on the list

btnDisconnect.Enabled = False           ‘Initially Disconnect Button is Disabled

End Sub





Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
SerialPort1.PortName = cmbPort.Text         ‘Set SerialPort1 to the selected COM port at startup
SerialPort1.BaudRate = cmbBaud.Text         ‘Set Baud rate to the selected value on list

‘Other Serial Port Property
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.DataBits = 8            ‘Open our serial port
SerialPort1.Open()

btnConnect.Enabled = False          ‘Disable Connect button
btnDisconnect.Enabled = True        ‘and Enable Disconnect button

End Sub





Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
SerialPort1.Close()             ‘Close our Serial Port

btnConnect.Enabled = True
btnDisconnect.Enabled = False
End Sub




Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
SerialPort1.Write(txtTransmit.Text & vbCr) ‘The text contained in the txtText will be sent to the serial port as ascii
‘plus the carriage return (Enter Key) the carriage return can be ommitted if the other end does not need it
End Sub




Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
ReceivedText(SerialPort1.ReadExisting())    ‘Automatically called every time a data is received at the serialPort
End Sub
Private Sub ReceivedText(ByVal [text] As String)
‘compares the ID of the creating Thread to the ID of the calling Thread
If Me.rtbReceived.InvokeRequired Then
Dim x As New SetTextCallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.rtbReceived.Text &= [text]
End If
End Sub




Private Sub cmbPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPort.SelectedIndexChanged
If SerialPort1.IsOpen = False Then
SerialPort1.PortName = cmbPort.Text         ‘pop a message box to user if he is changing ports
Else                                                                               ‘without disconnecting first.
MsgBox("Valid only if port is Closed", vbCritical)
End If
End Sub




Private Sub cmbBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaud.SelectedIndexChanged
If SerialPort1.IsOpen = False Then
SerialPort1.BaudRate = cmbBaud.Text         ‘pop a message box to user if he is changing baud rate
Else                                                                                ‘without disconnecting first.
MsgBox("Valid only if port is Closed", vbCritical)
End If
End Sub

End Class



How do I make it so that you can only send and receive hex??

Thanks

What I have tried:

Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
SerialPort1.PortName = cmbPort.Text         ‘Set SerialPort1 to the selected COM port at startup
SerialPort1.BaudRate = cmbBaud.Integer      ‘Set Baud rate to the selected value on list

‘Other Serial Port Property
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.DataBits = 8            ‘Open our serial port
SerialPort1.Open()

btnConnect.Enabled = False          ‘Disable Connect button
btnDisconnect.Enabled = True        ‘and Enable Disconnect button

End Sub


Invalid Cast excpetion was unhandled message appears, conversion from string to type integer not valid

解决方案

invalid Cast exception was unhandled , conversion from string "" to type integer is not valid


Is pretty clear - it's a text value you get from the COmbo Box - so you can;t just assign that to an integer. Convert it instead:

SerialPort1.BaudRate = Integer.Parse(cmbBaud.Text)


not post your whole app, coz no one is going to read it all. and don't need to.
post just that part with your problem.

witch is as OriginalGriff already mentioned that you give a String to a Property witch awaits an Integer.

you better put your Project to Option Strict ON
so Visual Studio shows you that error already while writing that piece of code.

as simple Solution for this, you just need to tell the Integer.Parse function that the String represents a Hex value

SerialPort1.BaudRate = Integer.Parse(cmbBaud.Text,System.Globalization.NumberStyles.HexNumber)


//Edit: This is wrong for your code!!


Update:
Error 1
if I change it to

Dim myPort As String() = IO.Ports.SerialPort.GetPortNames() 'Get all com ports available


it works for me.
just have seen you defined it as Array better don't do that. define it as String() and define it local as it's not going to be used elsewhere

instead of the For loop you can use just

cmbPort.Items.AddRange(myPort)
'and this here to select the first element.
cmbPort.SelectedIndex = 0
cmbBaud.SelectedIndex = 0



Error 2
Well its simple, the signatures are not matching
text as Byte VS text as String
you need to change one, the Method or the Delegate

also IMPORTANT .. there is another problem
have a look at Serial port - Wikipedia, the free encyclopedia[^]
9600, 19200, 38400 and so on.. are allready Integers.. thats no HEX if I read your program right.
It will only work if you select 9600 (Hex) as this is 38400 (dec) whitch is an valid Port speed. No need to parse that with base 16 ..
just an

SerialPort1.BaudRate = Integer.Parse(cmbBaud.Text)

like OriginalGriff sayd is the right answer
There is no HEX in that code you posted! I think you got that wrong!


这篇关于使用VB发送十六进制命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆