С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 3

Функция для обмена HEX данными через COM порт

04.02.2016, 20:19. Показов 3475. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите реализовать функцию работы с COM портом в консольном приложении.
Алгоритм такой:
Слушаем порт и при появлении HEX команды, отвечаем на нее тоже в HEХ.
Например приходит
01 0A 03 FF мы отвечаем 05 06 A7 B8
Пытался что-то "наваять":
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
' Use this code inside a project created with the Visual Basic > Windows Desktop > Console Application template.
' Replace the default code in Module1.vb with this code. Then right click the project in Solution Explorer,
' select Properties, and set the Startup Object to PortChat.
 
Imports System.IO.Ports
Imports System.Threading
 
Public Class PortChat
    Shared _continue As Boolean
    Shared _serialPort As SerialPort
 
    Public Shared Sub Main()
        Dim name As String
        Dim message As String
        Dim stringComparer__1 As StringComparer = StringComparer.OrdinalIgnoreCase
        Dim readThread As New Thread(AddressOf Read)
 
        ' Create a new SerialPort object with default settings.
        _serialPort = New SerialPort()
 
        ' Allow the user to set the appropriate properties.
        _serialPort.PortName = SetPortName(_serialPort.PortName)
        _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate)
        _serialPort.Parity = SetPortParity(_serialPort.Parity)
        _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits)
        _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits)
        _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake)
 
        ' Set the read/write timeouts
        _serialPort.ReadTimeout = 500
        _serialPort.WriteTimeout = 500
 
        _serialPort.Open()
        _continue = True
        readThread.Start()
 
        Console.Write("Started. Type Quit for exit")
        
        While _continue
            message = Console.ReadLine()
 
            If stringComparer__1.Equals("quit", message) Then
                _continue = False
            Else
                _serialPort.WriteLine([String].Format("> {1}", message))
            End If
        End While
 
        readThread.Join()
        _serialPort.Close()
    End Sub
 
    Public Shared Sub Read()
        Dim mess As String
        Dim comBuffer As String
        comBuffer = ""
        _serialPort.Read(comBuffer, 0, 2) 'read data from the buffer
        mess = Hex(comBuffer(2))
        Console.WriteLine(mess)
    End Sub
 
    Private Sub _serialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
        'This sub gets called automatically when the com port recieves some data
        'Pause while all data is read
        'Move recieved data into the buffer
        If _serialPort.IsOpen = True Then
            Read()
        End If
    End Sub
 
 
    ' Display Port values and prompt user to enter a port.
    Public Shared Function SetPortName(ByVal defaultPortName As String) As String
        Dim portName As String
 
        Console.WriteLine("Available Ports:")
        For Each s As String In SerialPort.GetPortNames()
            Console.WriteLine("   {0}", s)
        Next
 
        Console.Write("Enter COM port value (Default: {0}): ", defaultPortName)
        portName = Console.ReadLine()
 
        If portName = "" OrElse Not (portName.ToLower()).StartsWith("com") Then
            portName = "COM3"
        End If
        Return portName
    End Function
    ' Display BaudRate values and prompt user to enter a value.
    Public Shared Function SetPortBaudRate(ByVal defaultPortBaudRate As Integer) As Integer
        Dim baudRate As String
 
        Console.Write("Baud Rate(default:{0}): ", defaultPortBaudRate)
        baudRate = Console.ReadLine()
 
        If baudRate = "" Then
            baudRate = defaultPortBaudRate.ToString()
        End If
 
        Return Integer.Parse(baudRate)
    End Function
 
    ' Display PortParity values and prompt user to enter a value.
    Public Shared Function SetPortParity(ByVal defaultPortParity As Parity) As Parity
        Dim parity As String
 
        Console.WriteLine("Available Parity options:")
        For Each s As String In [Enum].GetNames(GetType(Parity))
            Console.WriteLine("   {0}", s)
        Next
 
        Console.Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString(), True)
        parity = Console.ReadLine()
 
        If parity = "" Then
            parity = defaultPortParity.ToString()
        End If
 
        Return CType([Enum].Parse(GetType(Parity), parity, True), Parity)
    End Function
    ' Display DataBits values and prompt user to enter a value.
    Public Shared Function SetPortDataBits(ByVal defaultPortDataBits As Integer) As Integer
        Dim dataBits As String
 
        Console.Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits)
        dataBits = Console.ReadLine()
 
        If dataBits = "" Then
            dataBits = defaultPortDataBits.ToString()
        End If
 
        Return Integer.Parse(dataBits.ToUpperInvariant())
    End Function
    ' Display StopBits values and prompt user to enter a value.
 
    Public Shared Function SetPortStopBits(ByVal defaultPortStopBits As StopBits) As StopBits
        Dim stopBits As String
 
        Console.WriteLine("Available StopBits options:")
        For Each s As String In [Enum].GetNames(GetType(StopBits))
            Console.WriteLine("   {0}", s)
        Next
 
        Console.Write("Enter StopBits value (Default: {0}):", defaultPortStopBits.ToString())
        stopBits = Console.ReadLine()
 
        If stopBits = "" Then
            stopBits = defaultPortStopBits.ToString()
        End If
 
        Return CType([Enum].Parse(GetType(StopBits), stopBits, True), StopBits)
    End Function
    Public Shared Function SetPortHandshake(ByVal defaultPortHandshake As Handshake) As Handshake
        Dim handshake As String
 
        Console.WriteLine("Available Handshake options:")
        For Each s As String In [Enum].GetNames(GetType(Handshake))
            Console.WriteLine("   {0}", s)
        Next
 
        Console.Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString())
        handshake = Console.ReadLine()
 
        If handshake = "" Then
            handshake = defaultPortHandshake.ToString()
        End If
 
        Return CType([Enum].Parse(GetType(Handshake), handshake, True), Handshake)
    End Function
End Class
Так же подскажите каким оператором выбора лучше обрабатывать входящие команды, что то типа: case .. of

P.S. В VB/VB.NET полный ноль.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2016, 20:19
Ответы с готовыми решениями:

Организация обмена данными через LPT-порт
разработайте программу определения адреса LPT - порта и вывода информации через LPT - порт, При этом светодиоды стенда должны отображать: ...

Преобразование строки в hex для отправки через COM порт
Вопрос, как вот это byte = { 0xAA, 0x00, 0x24, 0x00, 0x00, 0x24, 0x55 }; послать в COM порт. Точнее не в сам порт, а как сделать строку для...

Правильный подход обмена данных с устройствами через COM-порт. Целостность пакетов и производительность обмена
Приветствую вас, коллеги! Хочу с вами посоветоваться, ибо мне кажется, что я делаю это не совсем правильно, либо что-то не учёл... ...

4
 Аватар для edward_freedom
1569 / 1448 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
04.02.2016, 20:30
Ale-x1981, Можно вообще без if или case. Используй dictionary . Это у тебя будет ключом 01 0A 03 FF, а это значением 05 06 A7 B8
0
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 3
05.02.2016, 13:44  [ТС]
Как правильно организовать непрерывное "слушание" СОМ-порта чтобы программа не завершалась по таймауту.
Метод _DataReceived работает нормально. Использовать конструкцию Do .. Loop ?

Добавлено через 1 час 18 минут
Выкинул все лишнее.
Прога читает и передает ASCII символы из/в СОМ-порт.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Imports System.IO.Ports
Imports System.Threading
 
Public Class PortChat
    Shared _continue As Boolean
    Shared _serialPort As SerialPort
 
    Public Shared Sub Main()
        Dim message As String
        Dim stringComparer__1 As StringComparer = StringComparer.OrdinalIgnoreCase
        Dim readThread As New Thread(AddressOf Read)
 
        ' Create a new SerialPort object with default settings.
        _serialPort = New SerialPort()
 
        ' Allow the user to set the appropriate properties.
        _serialPort.PortName = "COM3"
        _serialPort.BaudRate = 9600
        _serialPort.Parity = Parity.None
        _serialPort.DataBits = 8
        _serialPort.StopBits = StopBits.One
        _serialPort.Handshake = Handshake.None
 
 
        ' Set the read/write timeouts
        _serialPort.ReadTimeout = 500
        _serialPort.WriteTimeout = 500
 
        _serialPort.Open()
        _continue = True
        readThread.Start()
 
        Console.WriteLine("Type QUIT to exit")
 
        While _continue
            message = Console.ReadLine()
 
            If stringComparer__1.Equals("quit", message) Then
                _continue = False
            Else
                _serialPort.WriteLine([String].Format("{0}", message))
            End If
        End While
 
        readThread.Join()
        _serialPort.Close()
    End Sub
 
    Public Shared Sub Read()
        While _continue
            Try
 
                Dim message As String = ""
                message = _serialPort.ReadExisting()
 
                Console.Write(message)
 
            Catch generatedExceptionName As TimeoutException
            End Try
        End While
    End Sub
 
 
End Class
Как теперь читать HEX и ответ также передавать в HEX?

Добавлено через 1 час 9 минут
Сделал топорно, но работает. Как оптимизировать конструкцию ответа?
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Imports System.IO.Ports
Imports System.Threading
 
Public Class PortChat
    Shared _continue As Boolean
    Shared _serialPort As SerialPort
 
    Public Shared Sub Main()
        Dim message As String
        Dim stringComparer__1 As StringComparer = StringComparer.OrdinalIgnoreCase
        Dim readThread As New Thread(AddressOf Read)
 
        ' Create a new SerialPort object with default settings.
        _serialPort = New SerialPort()
 
        ' Allow the user to set the appropriate properties.
        _serialPort.PortName = "COM3"
        _serialPort.BaudRate = 9600
        _serialPort.Parity = Parity.None
        _serialPort.DataBits = 8
        _serialPort.StopBits = StopBits.One
        _serialPort.Handshake = Handshake.None
 
 
        ' Set the read/write timeouts
        _serialPort.ReadTimeout = 500
        _serialPort.WriteTimeout = 500
 
        _serialPort.Open()
        _continue = True
        readThread.Start()
 
        Console.WriteLine("Type QUIT to exit")
 
        While _continue
            message = Console.ReadLine()
 
            If stringComparer__1.Equals("quit", message) Then
                _continue = False
            Else
                _serialPort.WriteLine([String].Format("{0}", message))
            End If
        End While
 
        readThread.Join()
        _serialPort.Close()
    End Sub
 
    Public Shared Sub Read()
        While _continue
            Try
                Dim i As Integer = 0
                Dim answerOK As Byte() = {&H2, &H3, &H6, &H19, &H82, &HF}
                Dim answerReset As Byte() = {&H2, &H3, &H6, &H0, &HC2, &H82}
                Dim answerStatus As Byte() = {&H2, &H3, &HB, &H0, &H0, &H0, &H0, &H0, &H0, &HA8, &H67}
                Dim mess As Byte() = {&H0, &H0, &H0, &H0, &H0, &H0}
                For i = 0 To 5
                    _serialPort.Read(mess, i, 1)
                Next
                Select Case mess(3)
                    Case &H33
                        For i = 0 To 5
                            _serialPort.Write(answerOK, i, 1)
                        Next
                        Console.WriteLine("Ok")
                    Case &H30
                        For i = 0 To 5
                            _serialPort.Write(answerReset, i, 1)
                        Next
                        Console.WriteLine("OkReset")
                    Case &H31
                        For i = 0 To 10
                            _serialPort.Write(answerStatus, i, 1)
                        Next
                        Console.WriteLine("StatusOk")
                End Select
 
            Catch generatedExceptionName As TimeoutException
            End Try
        End While
    End Sub
 
 
End Class
Добавлено через 27 минут
Кто подскажет как передать и принять в программе имя COM порта из командной строки?
0
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 3
07.02.2016, 00:00  [ТС]
Неужели никто не знает?
0
0 / 0 / 0
Регистрация: 26.12.2016
Сообщений: 1
26.12.2016, 10:32
Ale-x1981, благодарен за тему. Улучшить я вряд ли смогу. Долго не мог найти как передать данные в Hex через com, чтобы спутниковый приемник понял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2016, 10:32
Помогаю со студенческими работами здесь

Шаблон для обмена данными через память
Подскажите, нигде не нашел готовых шаблонов для создания обмена данными между процессами типа FileMapping. Может кто знает где взять?

Обмен данными через COM-порт
Всем доброго времени суток! Подскажите пожалуйста как передать введенные данные из компонента TexBox передать в COM-порт Дело в том что...

Обмен данными через COM порт
Доброго времени суток. Требуется производить обмен данными с неким устройством через СОМ порт. Сейчас использую вот такие функции: ...

Обмен данными через COM- порт
Добрый день, пытаюсь освоить передачу данных. Отсылаю на мк скажем "1", приходит "1" и "-38" почему-то. Та же история...

Обмен данными через COM порт
Нашел исходник программы для работы с com портом. Какие есть стандартные команды, чтобы получить хоть какой то ответ? А то что бы не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru