Member 12292743 Ответов: 1

Как отправлять и получать шестнадцатеричные команды с помощью visual basic


Застряли на том, как получать данные?

Чтобы дать вам некоторый контекст, у меня есть ИК-датчик "Optris CT", есть список команд, которые вы можете найти, погуглив команды Optris CT.

Любая помощь будет очень признательна.

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

1. Объявлен COM-порт

2. Написана функция для открытия порта

3. написана функция для отправки данных - я не уверен, что она правильна


Imports System.IO.Ports
Public Class Form1

  Dim ComPort As New SerialPort("COM1", 9600, Parity.None, 8, 1)

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

    ComPort.Open()

  End Sub

Private Sub cmdSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSend.Click
    Dim sendArray() As Byte = New Byte() {&H01, &H0, &H0, &H0, &H0, &H0, &H0, &H0}

ComPort.Write(sendArray, 0, 8)

  End Sub

1 Ответов

Рейтинг:
0

OriginalGriff

Хм.

Private Sub cmdSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStop.Click
Dim sendArray() As Byte = New Byte() {&H01, &H0, &H0, &H0, &H0, &H0, &H0, &H0}

ComPort.Write(stopArray, 0, 8)

End Sub

Ты имел в виду, чтобы отправить sendArray вместо stopArray?:
ComPort.Write(sendArray, 0, 8)


Member 12292743

да я отредактировал вопрос

Member 12292743

субмарина cmdSend выглядит нормально?

OriginalGriff

Мы не можем сказать-у нас нет такой же аппаратной установки, как у вас.
Что происходит, когда вы его вызываете?
Вы смотрели на сайт производителей?

Member 12292743

ладно, я понимаю. Однако как я могу идти о написании функции, чтобы получить шестигранник?

OriginalGriff

Получите шестигранный проста: вы просто используете метод чтения по примеру тех последовательный порт :
https://msdn.microsoft.com/en-us/library/ms143549(v=против 110). aspx
Но ... помните, что последовательные порты работают медленно: 9600 бод - это всего лишь около 1000 байт в секунду, так что если Вы читаете слишком рано, то можете получить не все байты, которые ожидаете.
Лучше использовать событие DataReceived и "наращивать" байты, которые вы получаете, пока не получите "полное" сообщение - вы, вероятно, получите одно событие на байт, а не одно на сообщение.

Member 12292743

потрясающе, еще один вопрос. Как сделать так, чтобы данные, полученные из порта, были записаны в текстовое поле?

OriginalGriff

Это немного сложнее, так как это зависит от того, как именно вы получаете данные. Если вы используете событие DataReceived - а вы должны это сделать, - то оно не выполняется в вашем обычном потоке, а это означает, что вы не можете напрямую получить доступ к каким-либо элементам управления формами.
Найдите в Google "Thread Invoke VB", и он должен дать вам примеры того, как это сделать.

Member 12292743

Так сработает ли это??


Система Импорта.ИО.Порты
Форма Публичного Класса 1

Dim ComPort As New SerialPort ("COM1", 9600, четность.Нет, 8, 1)

Частная суб методе form1_load(как byval отправителя как системы.Объект, бывал е как система.EventArgs) Обрабатывает MyBase. Load

Вести.Открыть()

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

Private Sub cmdSend_Click(ByVal sender As System.Объект, бывал е как система.EventArgs) обрабатывает cmdSend.Щелчок
Дим sendArray() как байт = новый байт() {&амп;Н01, &ампер;х0, &ампер;х0, &ампер;х0, &ампер;х0, &ампер;х0, &ампер;х0, &ампер;н0}

ComPort. Write(sendArray, 0, 8)

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

Публичная Функция Читать (
буфер в виде байта(),
смещение как целое число,
считать как целое число
) Как Целое Число

Конец Класса

OriginalGriff

Он вообще компилируется? Потому что я так не думаю... :смеяться:

Member 12292743

да, ха-ха, я сомневаюсь в этом, не скомпилировал. Что мне нужно добавить/изменить?

OriginalGriff

Никогда не спрашивайте людей" сработает ли это? " еще до того, как вы начнете писать код! Все, что вы будете делать, это раздражать их, поскольку мы должны предположить, что вы не собираетесь делать это сами и хотите, чтобы мы сделали это для вас...и это не то, для чего мы здесь.