Member 12292743 Ответов: 2

Отправка шестнадцатеричных команд с помощью VB


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


Как сделать так, чтобы вы могли только отправлять и получать гекс??

Спасибо

Что я уже пробовал:

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

Недопустимого приведения excpetion был появляется необработанное сообщение, преобразование из String в тип integer не действует

2 Ответов

Рейтинг:
1

OriginalGriff

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

Это довольно ясно - это текстовое значение, которое вы получаете из поля со списком, - так что вы можете просто присвоить его целому числу. Вместо этого преобразуйте его:
SerialPort1.BaudRate = Integer.Parse(cmbBaud.Text)


Member 12292743

извините я хотел сказать шестнадцатеричный а не целочисленный

Рейтинг:
0

F. Xaver

не публикуйте все свое приложение целиком, потому что никто не собирается читать его все. и не нужно.
опубликуйте только эту часть своей проблемы.

ведьма, как уже упоминалось в OriginalGriff, дает строку свойству witch, ожидающему целого числа.

вам лучше поставить свой проект на Вариант строго по
таким образом, Visual Studio показывает вам эту ошибку уже при написании этого фрагмента кода.

как простое решение для этого, вам просто нужно сказать Integer.Parse функция, что строка представляет собой шестнадцатеричное значение

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

// Edit: это неправильно для вашего кода!!


Обновление:
Ошибка 1
если я изменю его на
Dim myPort As String() = IO.Ports.SerialPort.GetPortNames() 'Get all com ports available

это работает на меня.
только что видел, как вы его определили as Array лучше не делай этого. определить его as String() и определите его локальным, так как он не будет использоваться в другом месте

вместо того чтобы For петлю вы можете использовать просто
cmbPort.Items.AddRange(myPort)
'and this here to select the first element.
cmbPort.SelectedIndex = 0
cmbBaud.SelectedIndex = 0


Ошибка 2
Ну это просто, подписи не совпадают
текст как байт против текста как строка
вам нужно изменить один из них, метод или делегат

тоже ВАЖНЫЙ . есть еще одна проблема
взгляните на Последовательный порт-Википедия, свободная энциклопедия[^]
9600, 19200, 38400 и так далее ... это уже целые числа.. это не гекс, если я правильно прочитал вашу программу.
Он будет работать только в том случае, если вы выберете 9600 (Hex), так как это 38400 (dec), что является допустимой скоростью порта. Нет необходимости разбирать это с базой 16 ..
просто
SerialPort1.BaudRate = Integer.Parse(cmbBaud.Text)
как и OriginalGriff sayd это правильный ответ
В том коде, который вы опубликовали, нет никакого шестнадцатеричного кода! Я думаю, что вы ошиблись!


Member 12292743

Теперь появилось 2 ошибки.

Private Sub frmMain_Load(ByVal sender As System.Объект, бывал е как система.EventArgs) Обрабатывает MyBase. Load

- Когда наша форма загрузится, автоматически определите все последовательные порты в системе и заполните поле со списком cmbPort.

myPort = ИО.Портах.SerialPort. GetPortNames () ' получить все доступные com-порты
смбо.Предметы.Добавить(9600) ‘заполнение поля со списком cmbBaud к общей скорости передачи данных используется

смбо.Предметы.Добавить (19200)
смбо.Items. Add (38400)
смбо.Items. Add (57600)


Для i = 0 до UBound(myPort)
cmbPort.Предметы.Добавить (myPort (i))
Следующий

cmbPort.Текст = cmbPort.Предметы.Item (0) ' Set cmbPort text to the first COM port detected
смбо.Текст = cmbBaud.Предметы.Item (0) ' Set cmbBaud text to the first Baud rate on the list

btnDisconnect.Enabled = False ' изначально кнопка отключения отключена

Конец Подводной Лодки

Опция strict on запрещает позднюю привязку (порт (i) был выделен


ВТОРАЯ ОШИБКА

Private Sub ReceivedText(ByVal [text] As String)
'сравнивает идентификатор создающего потока с идентификатором вызывающего потока
Если я. rtbReceived.Свойство Invokerequired Тогда
Dim x As New SetTextCallback(AddressOf ReceivedText)
Меня.Вызов(х, новый объект() {(текст)})
Ещё
Меня.rtbReceived.Text &= [текст]
Конец, Если
Конец Подводной Лодки

ReceivedText был подчеркнут и показано это сообщение об ошибке
Опция Strict on не позволяет сужать неявные преобразования типов между PRivate Sub receievedtext (text as String) и delegate delegate Sub SetTextCallback(text as Byte)

F. Xaver

Я обновил свое решение