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

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

14.06.2024, 20:07. Показов 1446. Ответов 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
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 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
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 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
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 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
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 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
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 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
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 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
1186 / 468 / 68
Регистрация: 22.09.2023
Сообщений: 1,408
20.06.2024, 12:11
Цитата Сообщение от Argus19 Посмотреть сообщение
Вот что заносится в структуру DCB. Явно что-то не так.
DCBlength равный нулю не смущает?
0
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
20.06.2024, 12:13
Argus19, в общем, как я думаю, вам нужно для начала сделать простейший пример успешного обмена данных с использованием ModBus (как по статье). Я не смогу сделать, поскольку мне не на чем проверять, могу только помочь с перехватом вызовов. Дальше надо будет делать трамплины на Api функции непосредственно перед их ожидаемым вызовом и смотреть что в них попадает. Как я думаю, для начала трамплин надо устанавливать перед строчками
Visual Basic
1
2
12    MSComm1.PortOpen = True
13    MSComm1.Output = Frame
На функцию BuildCommDCB, чтоб посмотреть с какими параметрами инициализируется соединение и дальшьше надо будет смотреть какие идут функции и делать на них трамплины. А я пока пойду высаживать капусту на грядки пока погода устоялась.
0
1186 / 468 / 68
Регистрация: 22.09.2023
Сообщений: 1,408
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
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru