С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Ale-x1981
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 3
1

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

04.02.2016, 20:19. Просмотров 966. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2016, 20:19
Ответы с готовыми решениями:

Сериализация для обмена данными между компьютерами
Недавно я столкнулся с такой проблемой: Есть 2 компьютера на которых...

Создание ОРС-клиента для обмена данными с ОРС-сервером (LectusОРС)
Добрый день! Необходимо создать приложение-клиент для обмена данными с...

Общение с микроконтроллером через COM порт для управления светодиодной лентой
Приветствую! Подскажите, что не так? Написал код в Visual Basic 2012 для...

Программа для связи с устройством через СОМ порт.Фиаско(
Друзья, всем добрый день. Решил написать программу для передачи и приема данных...

Реализация обмена данными между серверным и клиентским приложениями
Подскажите правильный и простой (насколько возможно) способ отправления данных...

4
edward_freedom
1555 / 1434 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
04.02.2016, 20:30 2
Ale-x1981, Можно вообще без if или case. Используй dictionary . Это у тебя будет ключом 01 0A 03 FF, а это значением 05 06 A7 B8
0
Ale-x1981
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 3
05.02.2016, 13:44  [ТС] 3
Как правильно организовать непрерывное "слушание" СОМ-порта чтобы программа не завершалась по таймауту.
Метод _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
Ale-x1981
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 3
07.02.2016, 00:00  [ТС] 4
Неужели никто не знает?
0
MikhailMorozov
0 / 0 / 0
Регистрация: 26.12.2016
Сообщений: 1
26.12.2016, 10:32 5
Ale-x1981, благодарен за тему. Улучшить я вряд ли смогу. Долго не мог найти как передать данные в Hex через com, чтобы спутниковый приемник понял.
0
26.12.2016, 10:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2016, 10:32

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru