Что нового

Проблемы работы с COM-портом

Yuriy_V.

Новичок
Сообщения
22
Репутация
0
Добрый день.

Пытаюсь работать с COM-портом через библиотеку CommMG.au3. Но почему-то не могу подключиться к ком порту.
Драйвера на переходник USB-RS232 установлены, через терминальную программу Terminal v1.9b работать с переходником могу.
Но через Auto-It почему то не могу подключиться к COM-порту.
Пример кода:
Код:
#include <GUIConstants.au3> 
#include <WindowsConstants.au3> 
#include <CommMG.au3> 
;------------- 
If Not FileExists("portsettings.ini") Then ;если файл не существует, то 
$iniFile = FileOpen ( @ScriptDir&"\portsettings.ini", 1 );создаём 
 ;и пишем в него всю структуру 
FileWrite ( $iniFile, "[comport]"&@CRLF&"port=1"&@CRLF&"baud=115200"& _ 
@CRLF&"databits=8"&@CRLF&"stopbits=1"&@CRLF&"parity=0"&@CRLF&"flowcontrol=0") 
FileClose ($iniFile) 
MsgBox (0, "AT sender v.0.1", "Это первый запуск, настройте параметры COM порта в файле portsettings.ini"& _ 
@CRLF&"port - Номер порта"&@CRLF&"baud - Скopocть (бит/c)"&@CRLF&"databits - Биты дaнныx"&@CRLF& _ 
"stopbits - Стoпoвыe биты"&@CRLF&"parity - Чeтнocть"&@CRLF&"flowcontrol - Упpaвлeниe пoтoкoм") 
Exit 
 EndIf 
;------------- 
$port = IniRead (@ScriptDir&"\portsettings.ini", "comport", "port", "NotFound");Номер порта 
$baud = IniRead (@ScriptDir&"\portsettings.ini", "comport", "baud", "NotFound");Скopocть (бит/c) 
$databits = IniRead (@ScriptDir&"\portsettings.ini", "comport", "databits", "NotFound");Биты дaнныx 
$stopbits = IniRead (@ScriptDir&"\portsettings.ini", "comport", "stopbits", "NotFound");Стoпoвыe биты 
$parity = IniRead (@ScriptDir&"\portsettings.ini", "comport", "parity", "NotFound");Чeтнocть 
$flowcontrol = IniRead (@ScriptDir&"\portsettings.ini", "comport", "flowcontrol", "NotFound");Упpaвлeниe пoтoкoм 
$result_err = "" 
$status_string = "Нет подключения" 
;------------- 
 ;подключаемся к порту 
$portstatus = _CommSetPort($port,$result_err,$baud,$databits,$parity,$stopbits,$flowcontrol) 
If $portstatus = 1 Then ; если ответ функции 1 то всё ОК и пишем это на лейбле 
$status_string = "Подключено к порту: COM"&$port 
Else ; если ответ не 1 то всё плохо... 
$status_string = "Ошибка подключения к порту: COM"&$port 
EndIf 
; ~~~~~~~~ 
$Form1 = GUICreate("AT sender v.0.1", 395, 192) 
$Label1 = GUICtrlCreateLabel ($status_string,8, 2, 390, 17) 
$Input1 = GUICtrlCreateInput("", 8, 152, 297, 21) 
$Button1 = GUICtrlCreateButton("Send", 312, 150, 75, 25, 0) 
$Edit1 = GUICtrlCreateEdit("", 8, 20, 377, 121, $WS_VSCROLL) 
GUISetState(@SW_SHOW) 
; ~~~~~~~~ основной цикл программы ~~~~~~~~ 
While 1 
     $nMsg = GUIGetMsg() 
     Switch $nMsg 
     Case $GUI_EVENT_CLOSE 
         If $portstatus = 1 Then 
         $status_string = "Закрытие порта: COM"&$port&" ..." 
         GUICtrlSetData ($Label1, $status_string) 
         sleep(800);пауза, чтоб успели прочитать лейбл 
         EndIf 
         Exit 
     Case $Button1 
         $senddata = GUICtrlRead ($Input1); считываем что ввели в Input 
         If Not $senddata = "" Then; если не путо, то отправляем порту 
         _CommSendString($senddata&@CR, 1); в конце нужно добавлять @CR 
         GUICtrlSetData ($Edit1, "Отправлено:"&@CRLF&$senddata&@CRLF,1);пишем в Edit 
         Else 
         GUICtrlSetData ($Edit1, "Ошибка: нечего отправлять!"&@CRLF,1) 
         EndIf 
     EndSwitch 
$Ret_string =  _CommGetstring(); постоянно опрашиваем порт в цикле 
If Not $Ret_string = "" Then ; если возвращённый результат не пустой 
GUICtrlSetData ($Edit1, "Принято:"&@CRLF&$Ret_string&@CRLF,1); то пишем в Edit 
$Ret_string = "";обнуляем переменную 
EndIf 
 WEnd 
; ~~~~~~~~ основной цикл программы ~~~~~~~~ 
Func OnAutoItExit(); функция срабатывает при выходе. 
 _CommClosePort() 
;MsgBox (0, "AT sender v.0.1", "порт закрыт") 
EndFunc


В чем может быть проблема? Где-то в инете видел тему, что библиотека CommMG.au3 не совсем "дружит" с Windows 10
Кто-то работал с ком-портом в autoit под Windows 10 ?
 

VadimKHL

Новичок
Сообщения
155
Репутация
0
Добрый день!
Работает без проблем на Win10.
В чем конкретно проблема?
Сообщение автоматически объединено:

Пример посылает сообщение, а кто отвечает?
Лучше сделать опрос наличия ответа, чем постоянно читать порт, вот к примеру как у меня:

Код:
; ====================================================================================================================
; Функция ожидания принятия 10 байт во входной буфер.
; ====================================================================================================================
Func _Wait10byte()
   For $i = 1 to 50
      If _CommGetInputCount() >= 10 Then
         Return 0
      EndIf
   sleep(1)
   Next
Return 1
EndFunc


Можно попробовать передать данные немного подругому:
Код:
; Очищаем выходной/входной буфер.
       _CommClearOutputBuffer()
       _CommClearInputBuffer()

       ; Передать 10 байт команды теста соединения(ожидаем завершения передачи данных).
       Local $bBinData = Binary("0x2413544553544C4EE804")
       Local $tBinData = DllStructCreate("byte[10]")
       DllStructSetData($tBinData, 1, $bBinData)
       _CommSendByteArray(DllStructGetPtr($tBinData),10,1)
       _Wait10byte() ; Ожидаем принятия 10 байт.

       ; Считываем входной буфер (ответ от устройства) и проверяем ответ.
       $bBinData = Binary("0x2413434D445F4F4B04F5")
       Local $INBUFFER=_CommGetstring()

             If $bBinData = $INBUFFER Then
             GUICtrlSetData ($LSEAREACHx, "Device found.", "1")
             GUICtrlSetData ($LSEAREACH, "Searching for a device ... OK!")
             sleep(100)
             GUIDelete($WINSEAREACH)
             Return $aNUMCom[$i]
             Else
             GUICtrlSetData ($LSEAREACHx, "Device not found.", "1")
             EndIf
    EndIf
 
Последнее редактирование:
Автор
Y

Yuriy_V.

Новичок
Сообщения
22
Репутация
0
до передачи и приема данных дела не доходит.
Код:
;------------- 
 ;подключаемся к порту 
$portstatus = _CommSetPort($port,$result_err,$baud,$databits,$parity,$stopbits,$flowcontrol) 
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] $portstatus = 1 [URL='https://autoit-script.ru/docs/keywords/if.htm']Then[/URL] ; если ответ функции 1 то всё ОК и пишем это на лейбле 
$status_string = "Подключено к порту: COM"&$port 
[URL='https://autoit-script.ru/docs/keywords/else.htm']Else[/URL] ; если ответ не 1 то всё плохо... 
$status_string = "Ошибка подключения к порту: COM"&$port 
[URL='https://autoit-script.ru/docs/keywords/if.htm']EndIf[/URL] 
; ~~~~~~~~


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

VadimKHL

Новичок
Сообщения
155
Репутация
0
Проверил на WIN10 ваш код.
Работает:


Попробуйте скачать заново DLL от UDF'ки.
Сообщение автоматически объединено:

Я надеюсь у Вас лежит commg.dll в паке со скриптом?
 
Последнее редактирование:
Автор
Y

Yuriy_V.

Новичок
Сообщения
22
Репутация
0
Конечно лежит. А Вам не сложно прикрепить свои UDF и DDL которые используете ?
 
Верх