Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22

Как правильно настроить СОМ-порт?

14.06.2024, 20:07. Показов 1465. Ответов 22

Студворк — интернет-сервис помощи студентам
В теме:
Приложение VBA Excel: обращение к Slave-устройству по протоколу Modbus RTU через порт RS485
ТС задал интересный вопрос:
"Прошу оказать консультативную помощь в создании приложения Master-устройства для общения со Slave-устройством по протоколу Madbus RTU, через порт RS485, с помощью Vba Excel."
Это показалось интересным, т.к. для VBA не требуется установка среды разработки и есть возможность сразу заполнять таблицу Excel.
В связи с тем, что VBA по сути урезанный VB, решил сделать с использованием функций Win 32 API.
При подключении ковертера USB-RS232, порт открывается и закрывается, но при попытке передать что-либо в него, появляется ошибка #31: "Устройство, подключенное к системе, не работает." При повторной отправке программно успешно, но данные не передаются. Подозреваю, дело в не правильном заполнении структуры DCB.
В прикреплённом файле пока не всё благополучно. Пока не пойму в чём ошибка.
Вложения
Тип файла: zip Книга1.zip (27.5 Кб, 17 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.06.2024, 20:07
Ответы с готовыми решениями:

Как подать АТ команду в созданый сом порт
как подать АТ команду в созданый сом порт, с помощю макроса?

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

Не могу настроить сканер штрих-кодов на СОМ-порт (+)
Добрый день! Помогите, пожалуйста, одной проблеме. Не могу настроить сканер штрих-кодов IDZOR 2200 2D (проводной) / ID220-2D/СОМ (RS-232)...

22
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
15.06.2024, 04:43
Интересно, почему первых 2 параметра Integer, а остальные String и все ByRef?
Visual Basic
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
Private Sub CommandButton4_Click()  'Отправить фрейм
    'Dpribor1 = 0
    Call TxRx(2, 3, 0, 1, 0, 1)                          'Отправить команду
End Sub
 
Sub TxRx(ByRef Nport As Integer, ByRef Func As Integer, _
         ByRef Data1 As String, ByRef Data2 As String, ByRef Data3 As String, ByRef Data4 As String)
'функция отправляет устройству Modbus дейтаграмму
    Dim Frame As String                         ' формируемое сообщение на отправку
    Dim RetBytes As Long, LenVal As Long
'    Dim RxFrame As String                    ' принимаемое сообщение из порта RS485
    
    Frame = Chr(Nport) & Chr(Func) & Chr(Data1) & Chr(Data2) & Chr(Data3) & Chr(Data4)
    Frame = Frame & CRC_16(Frame)
'    If Len(Frame) > 255 Then
'       WriteCOM32 Left$(Frame, 255)
'      WriteCOM32 Right$(Frame, Len(Frame) - 255)
'       Exit Function
'    End If
    
    On Error GoTo handelwritelpt
    For LenVal = 0 To Len(Frame) - 1
        bRead(LenVal) = Asc(Mid$(Frame, LenVal + 1, 1))
    Next LenVal
 
    retval = WriteFile(ComNum, bRead(0), Len(Frame), RetBytes, ByVal CLng(0))
    If retval = False Then
        MsgBox ("Write port ERROR:" & GetLastError)
    Else
        MsgBox ("Data write: Ok")
    End If
handelwritelpt:
    Exit Sub
End Sub
Ели нужно cформировать строку из последовательности байт (2, 3, 0 ..) то можно просто заполнить байтовый массив и присвоить его строке
Visual Basic
1
2
3
    ReDim b(5) As Byte
    b(0) = Nport: b(1) = Func: b(2) = Data1: b(3) = Data2: b(4) = Data3: b(5) = Data4
    Frame = b
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
15.06.2024, 10:41  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Интересно, почему первых 2 параметра Integer, а остальные String и все ByRef?
Это компиляция из моей старой программы, работавшей с MsComm и кучи программ, работающих с Win32 API. Всё пока сырое.
Можно и через массив.
Формируется строка для отправки, но она не отправляется. Если бы строка была сформирована неправильно, то появлялось бы сообщение о несоответствии данных. Но появляется сообщение о неработоспособности устройства, подключенного к системе. При повторном нажатии на кнопку появляется сообщение: "Data write: Ok". Однако передачи данных не происходит.
В этом проблема.
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
15.06.2024, 12:02
Цитата Сообщение от Argus19 Посмотреть сообщение
Это компиляция из моей старой программы, работавшей с MsComm
Если идти по пути наименьшего сопротивления, если у вас работало с MsComm, можно попробовать подключить mscomm32.ocx в vba и использовать его там
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
15.06.2024, 12:11  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
можно попробовать подключить mscomm32.ocx в vba и использовать его там
Это потребует манифест. Я не знаю, куда его поместить в VBA. С VB это решаемо.
И всё-таки, есть желание сделать двоичный обмен данными.
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
15.06.2024, 12:15
Цитата Сообщение от Argus19 Посмотреть сообщение
Это потребует манифест.
А как-нибудь так его просто нельзя использовать?
Visual Basic
1
Set mcom = CreateObject("MSCommLib.MSComm")
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
15.06.2024, 12:53  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
А как-нибудь так его просто нельзя использовать?
Не знаю.
В своё время я начал переход на функции Win API. Получилось намного лучше, т.е. надёжнее, чем MsComm. Но у меня вышел из строя винчестер и было потеряно много рабочих файлов. Вот и ищу способ правильной настройки СОМ-порта. С MsComm уже нет желания связываться. О чём я писал в самом первом посте.
1
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
15.06.2024, 14:01
Цитата Сообщение от Argus19 Посмотреть сообщение
Но у меня вышел из строя винчестер и было потеряно много рабочих файлов.
Цитата Сообщение от Argus19 Посмотреть сообщение
Если интересно, покажу функцию обмена по ModbusRTU с использованием MSComm.
Стало быть уже не сможете показать? А надо было )

Добавлено через 59 минут
Хотя, там же было сказано про MsComm
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
15.06.2024, 18:19  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Хотя, там же было сказано про MsComm
В том-то и дело, что был сделан модуль, прекрасно работающий с Win32 API. Пытаюсь, если не вспомнить, то спросить. Пока ответа нет.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
19.06.2024, 18:58  [ТС]
Вот что заносится в структуру DCB. Явно что-то не так.
Миниатюры
Как правильно настроить СОМ-порт?  
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
20.06.2024, 08:36
Argus19, попробуйте, может быть, трассировать вызовы с помощью какого-инбудь api-монитора при использовании MsComm, но есть еще есть шароварный mbaxp.ocx

Добавлено через 1 час 7 минут
Еще как-то можно делать "трамплин", это когда вызов библиотечной функции перенаправляется на vb-шную прокси-функцию (не знаю как точно это называется в хакерской терминологии )). В этой прокси-функции можно будет увидеть какие приходят аргументы, если скажем api-функцию вызовет MsComm, но это наверное муторно, каждую api-функцию так отлавливать и смотреть..

Добавлено через 2 часа 5 минут
Здесь Трик ставит заглушку ("ret") для библиотечной функции, немного по другому, чем в примере с трамплином, с использованием "VirtualProtect". Но в VBA это все не работает, это похоже работает только в компиле на VB6 и на нем надо проверять.
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
20.06.2024, 10:29  [ТС]
Попробовал ещё вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.....
Public rc As Long
Public h As Long  'Хэндл порта.
Public d As DCB   'The DCB structure and the SetCommState() function allow to set the baud rate and
                  the byte size of theбserial port.
................
Public Sub Sending()
    ' Sending an array of 3 bytes to a remote device.
 
    Dim bWrite(1 To 3) As Byte
    bWrite(1) = &HA1
    bWrite(2) = &HB2
    bWrite(3) = &HC3
    Dim wr As Long
    rc = WriteFile(h, bWrite(1), 3, wr, 0) ' The wr indicates how many bytes were went to the port.
    If rc = 0 Then
      rc = Err.LastDllError
      MsgBox "WriteFile failed, the error code is " & Str(rc)
      GoTo close_and_exit
    End If
close_and_exit:
    rc = CloseHandle(h)
End Sub
Опять возникает ошибка №31.
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
20.06.2024, 11:08
Цитата Сообщение от testuser2 Посмотреть сообщение
VBA это все не работает
Работает, ошибся. Простой пример с функцией Beep для vba x86
Кликните здесь для просмотра всего текста
Visual Basic
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
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function GetModuleHandleW Lib "kernel32" (ByVal lpModuleName As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesRead As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
Private Declare Function BeepApi Lib "kernel32.dll" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
 
Private pOrigFn As Long, baOrig(5) As Byte
 
Function InstallTramp()
    Dim pTrmpFn As Long, baTrmp(5) As Byte, hProc&, OldProtect&, old2&, ret&
    
    pOrigFn = GetProcAddress(GetModuleHandleW(StrPtr("kernel32")), "Beep") ' Get the address of the "DialogBoxParamA" function
    ReadProcessMemory -1, pOrigFn, baOrig(0), 6, 0                        ' Save the first 6 bytes (the size of the trampoline) to be restored later
    baTrmp(0) = &H68 ' push
    CopyMemory baTrmp(1), AddressOf ProxyFunc, 4
    baTrmp(5) = &HC3 ' ret
    WriteProcessMemory -1&, pOrigFn, baTrmp(0), 6, ByVal 0                ' Now the InputBox function will call our custom "HookedDialogBoxParamA" function instead
End Function
 
Sub TestTramp()
    Debug.Print BeepApi(700, 500)
End Sub
 
Private Function ProxyFunc(ByVal param1 As Long, ByVal param2 As Long) As Long
    WriteProcessMemory -1, pOrigFn, baOrig(0), 6, 0 'убираем трамплин, восстанавливаем прежнее состояние
    ProxyFunc = param1 + param2
End Function


Добавлено через 19 минут
Argus19, можете скинуть рабочий код под MsComm?
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
20.06.2024, 11:30  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
можете скинуть рабочий код под MsComm?
Я начинал с этой статьи:
Вложения
Тип файла: zip Работа с протоколом Modbus RTU в среде Visual Basic 6.zip (14.7 Кб, 18 просмотров)
0
1458 / 474 / 70
Регистрация: 22.09.2023
Сообщений: 1,432
20.06.2024, 12:11
Цитата Сообщение от Argus19 Посмотреть сообщение
Вот что заносится в структуру DCB. Явно что-то не так.
DCBlength равный нулю не смущает?
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
20.06.2024, 12:13
Argus19, в общем, как я думаю, вам нужно для начала сделать простейший пример успешного обмена данных с использованием ModBus (как по статье). Я не смогу сделать, поскольку мне не на чем проверять, могу только помочь с перехватом вызовов. Дальше надо будет делать трамплины на Api функции непосредственно перед их ожидаемым вызовом и смотреть что в них попадает. Как я думаю, для начала трамплин надо устанавливать перед строчками
Visual Basic
1
2
12    MSComm1.PortOpen = True
13    MSComm1.Output = Frame
На функцию BuildCommDCB, чтоб посмотреть с какими параметрами инициализируется соединение и дальшьше надо будет смотреть какие идут функции и делать на них трамплины. А я пока пойду высаживать капусту на грядки пока погода устоялась.
0
1458 / 474 / 70
Регистрация: 22.09.2023
Сообщений: 1,432
20.06.2024, 12:15
ByteSize тоже странный:
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
20.06.2024, 12:37  [ТС]
Цитата Сообщение от Dushevny Посмотреть сообщение
DCBlength равный нулю не смущает?
Цитата Сообщение от Dushevny Посмотреть сообщение
ByteSize тоже странный:
В чём и дело.
Цитата Сообщение от testuser2 Посмотреть сообщение
в общем, как я думаю, вам нужно для начала сделать простейший пример успешного обмена данных с использованием ModBus (как по статье).
Делал и всё работало. Безвозвратно потерян код, успешно работавший с функцинями API.
0
1385 / 840 / 91
Регистрация: 08.02.2017
Сообщений: 3,563
Записей в блоге: 1
20.06.2024, 12:42
С использованием mscomm я хотел сказать
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
20.06.2024, 13:04  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
С использованием mscomm я хотел сказать
Этого навалом в интернете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2024, 13:04
Помогаю со студенческими работами здесь

Примеры использования Async Free (СОМ-порт) или Async Pro (СОМ-порт)
Здравствуйте! Скажите пожалуйста есть пример где используют Async Free (СОМ-порт) или Async Pro (СОМ-порт)? почему то не могу найти и...

COM-порт, как правильно настроить
Доброго времени суток. Прошу помощи в решении следующей проблемы: на COM порте висит железка, которая постоянно посылает данные в порт....

Как распараллелить Сом порт?
Не нашел в какой раздел написать. Вопрос вот какой, есть живой МК Tibbo 1206 http://www.tibbo.ru/products/item/6/20/ , у него 4 Сом порта....

СОМ порт - как передать код
Как в с++ передать код на com порт? К примеру на (* basic по моему) out(%.....), 4 на порт (%.....) выводим (out) число (4) в десятичном,...

Как программно разблокировать зависший СОМ порт?
есть ком порт (СОМ1, не виртуальный), на котором принимаются данные и вдруг данные не поступают, программа (не моя, редактировать не могу)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru