0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 7
1

Чтение данных через COM порт

21.03.2012, 22:33. Показов 19393. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется устройство, панель кнопок, связанная с компом через RS-232 т.е. COM порт.
Хочу сделать прогу, которая отображала бы нажатие кнопок на этой панели кнопок, т.е. например, нажал Клавиша_1 - изменились бы данные в Label1
Устройство работает на определенной скорости - 115200 бод, 8 бит, 1стоп бит, без контроля четности.

Это устройство постоянно, с интервалом 100 мс, выдает 2 байта информации.
Первый байт (байт посылки)
B7 - 1b
B6 - Клавиша_1
B5 - Клавиша_2
B4 - Клавиша_3
B3 - Клавиша_4
B2 - Клавиша_5
B1 - Клавиша_6
B0 - Клавиша_7

второй байт
B7 - 0b
B6 - N/A
B5 - Количество неустановленных битов в первом байте(B6-B0)
B4 - Количество неустановленных битов в первом байте(B6-B0)
B3 - Количество неустановленных битов в первом байте(B6-B0)
B2 - Количество установленных битов в первом байте(B6-B0)
B1 - Количество установленных битов в первом байте(B6-B0)
B0 - Количество установленных битов в первом байте(B6-B0)

Установленный старший бит указывает, что это первый байт посылки. Остальные биты в первом байте принимают значения 0b - если соответствующая кнопка нажата, или 1b - если кнопка не нажата.

ТО что нужно юзать MScomm понятно, но как работать с 2 байтами, ведь MScomm работает со строковыми значениями.
У кого нить есть похожие наработки или идеи от чего оттолкнуться?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2012, 22:33
Ответы с готовыми решениями:

Можно ли через VB организовать связь (через паралельный порт) с отдельным устройством?
Вот хотелось бы узнать можно ли через VB организовать связь (через паралельный порт) с отделным...

Чтение/передача данных через USB порт
Задача такова: есть внешний микроконтроллер (Arduino) который связан с ПК ч/з USB (некоторый...

Чтение данных из файла и их передача через порт компьютера
Добрый день. Есть задача: в текстовый файл в реальном времени пишется поток данных (углы...

Что чтение данных через COM-порт делает с 2байтными значениями?
Я принимаю через СОМ-порт 8-байтные слова с определенного устройства. Делается это при помощи...

8
10234 / 6612 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
21.03.2012, 23:56 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

ТО что нужно юзать MScomm понятно
Работа с СОМ портом в VB6 с помощью API функций

1. Открытие порта
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, n byte.
    BaudRate As Long        'Speed of data exchangeб, bps
    fBitFields As Long      'Bit field for setting of port
    wReserved As Integer    'Reserved
    XonLim As Integer       'minimum number of bytes in the buffer to send Xon
    XoffLim  = False Then
            MsgBox ("Error Setting port:" & GetLastError)
        End If
        MsgBox ("The port is opened")
       
    End If
    
End Function
2. Закрытие порта
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
'Function of closing the port
Function Com_Close() As Boolean
    Dim Retval As Long
    
    Retval = CloseHandle(Com_Handle)
    If Retval = 0 Then
        MsgBox ("Error while closing the port")
    Else
        MsgBox ("Port closed")
    End If
End Function
3. Запись в порт
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Boolean
 
Declare Function GetLastError Lib "kernel32" () As Long
 
'Recording function to the port
Function Com_Write(n As Long)
    Dim Len_Buf As Long
    Dim Retval As Boolean
  
    Retval = WriteFile(Com_Handle, Buf(0), n, Len_Buf, 0)
    If Retval = False Then
        MsgBox ("Error Write port:" & GetLastError)
    End If
   
End Function
вызов из формы
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'Write port
Sub Command4_Click()
    Dim s As String
    Dim n As Long
    Dim a As Integer
    Dim Retval As Long
    
    s = Text2.Text
    n = Len(s)
    For a = 1 To n
        Buf(a - 1) = Asc(Mid(s, a, 1))
    Next a
    Com_Write (n)
End Sub
4. Чтение данных из порта
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Long) As Boolean
 
Declare Function GetLastError Lib "kernel32" () As Long
 
Global Com_Handle As Long 'Descriptor of port
Global Buf(1024) As Byte 'The buffer of port
Global Com_Byte_Read As Long 'количество принятых байт
 
 
'function of reading from the port
Function Com_Read()
    Dim Retval As Boolean
    
    Retval = ReadFile(Com_Handle, Buf(0), 1024, Com_Byte_Read, 0)
    If Retval = False Then
        MsgBox ("Error Read port:" & GetLastError)
    End If
  
End Function
Вызов из формы (ваши байты в исходном виде и перевод):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
'Read port
Private Sub Command3_Click()
   Dim s As String
    Dim a As Long
    
   Com_Read
   For a = 1 To Com_Byte_Read
        s = s & Chr(Buf(a - 1))
   Next a
   Text1.Text = s
End Sub
4
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 3
10.12.2019, 16:46 3
Всем привет!
Прошу прощения, что поднимаю старую тему, но в ответе в разделе "Открытие порта" часть кода отсутствует.
Сам не могу дописать, так как только учусь.
Может у кого остался оригинал этого поста с функцией целиком?
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
10.12.2019, 17:13 4
А что не получается, вижу что функция у raxp, объявленна криво может в этом дело ? )

Добавлено через 8 минут
любая процедура в начале названия имеет либо sub либо function
в вашем случае пропущена строчка, конечно легко можно догадаться что там должно быть, )) автора можно не реанимировать
0
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 3
10.12.2019, 17:13 5
Так нет куска кода между
Цитата Сообщение от raxp Посмотреть сообщение
lpSecurityAttributes As Long
и этим
Цитата Сообщение от raxp Посмотреть сообщение
n byte.
Также отсутствует кусок кода между
Цитата Сообщение от raxp Посмотреть сообщение
XoffLim
и этим
Цитата Сообщение от raxp Посмотреть сообщение
= False Then
MsgBox ("Error
Также может еще чего нет.
Функцию я объявил стандартно
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Цитата Сообщение от fever brain Посмотреть сообщение
конечно легко можно догадаться что там должно быть
Кому то может и легко, а мне тяжело, пока еще обучаюсь по примерам
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
10.12.2019, 17:25 6
я так понимаю некоторой из пропущенных переменных должно присвоится значение из CreateFile тоесть если в аргументах есть префикс byRef значит она присвояемая

пример xxx(byVal a, byref b, byVal c)

в модуле файла все эти переменные в аргументах тоесть: a, b, c не будут видны, зато переменная b может передовать свои данные в других процедурах если ее тип будет корректен тоесть числовой должен быть равен числовому и т.д
0
617 / 407 / 78
Регистрация: 24.09.2017
Сообщений: 2,375
Записей в блоге: 17
10.12.2019, 17:54 7
Нет декларации DCB. Почитайте Дэна Эпплмана "Win32 API и Visual Basic_Для профессионалов". На прилагаемом CD есть пример.
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
10.12.2019, 17:59 8
этих динозавров откапывать не потребуется., гдето есть на этом форуме нормальная реализация то что написанно в этой теме.. здесь по-просту перепост
0
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 3
10.12.2019, 18:18 9
Спасибо! Нашел ответ здесь в приложении 1
0
10.12.2019, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2019, 18:18
Помогаю со студенческими работами здесь

Подключение/чтение/отправка данных на сторонние устройства через usb COM порт
сабж: как подключить к андроид устройству сторонние девайсы по COM порту и впоследствии...

Чтение информации с весов через COM порт
Здравствуйте. Недавно начал изучать C++ и стоит такая задача. У меня есть программка, которая...

Передача данных через Com порт
Добрый день форумчане! Мне с помощью программы "free-serial-port-monitor" удалось считал данные,...

Передача данных через ИК порт
Нужно организовать систему передачи данных через инфракрасный на ассемблере. ИК должен...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru