Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual Basic .NET

Войти
Регистрация
Восстановить пароль
 
Ale-x1981
0 / 0 / 0
Регистрация: 03.02.2016
Сообщений: 3
#1

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

04.02.2016, 20:19. Просмотров 687. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция для обмена HEX данными через COM порт (Visual Basic .NET):

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

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

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

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

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

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

4
edward_freedom
Нарушитель
1452 / 1354 / 245
Регистрация: 01.10.2011
Сообщений: 2,189
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
Привет! Вот еще темы с ответами:

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

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

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

Обмен данными через параллельный порт - Программирование
Нужен код программы, которая будет обмениваться данными с устройством, подключенное через параллельный порт В частности, обмен данными с...


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

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

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