Что нового

Нужно получать данные с порта COM

triceraptors

Новичок
Сообщения
4
Репутация
0
Версия AutoIt: 3.3.6.1

Описание:
Есть устройство на компорт ( может меняться номер) и есть ексель, требуется получать с порта данные (они ползут оттуда регулярно ;) )и вводить их в таблицу, так вот второй вопрос получился, если не замечательно, но зато работает а вот получать данные из железного устройства ну никак не выходит.
В инете уже обгуглился ;) по этому вопросу, ничего подходящего нет как и мыслей, просто реализовать надо (!) именно на автоит, ибо там человек будет иногда менять алгоритм обработки принятых данных и очень настаивает... Отказать в такой вроде несложной услуге не мог, а теперь сам начну косить под инвалида. :D


Примечания:
Устройство нехитрое, периодически отправляет показания пульсомера или как он там называется на терминал, сделал небольшой адаптер и переходник под ЮСБ. Сначала все шло просто на хипертерминал, оттуда вручную копипастом в ексель. Попытки автоматизировать этот процесс привели к кошмарному коду :shok:

З.Ы. В настоящий момент получение данных реализовано на ассемблере ( ну другого толком не знаю, микроконтроллеры моя работа :rofl:) и пишется в файл, который регулярно читается скриптом, но это согласитесь костыли не лучшего вида ...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: нужно получать данные с КОМПОРТА

{LangWarn}
 

ynbIpb

Скриптер
Сообщения
399
Репутация
109
Re: нужно получать данные с КОМПОРТА

Serial Port /COM Port UDF
используется библиотека commg.dll для дуступа к порту.
Я помню общался с USB модемом через эту UDF

з.ы.
вот откопал свой скрипт, но было это в 2009 году, может уже и не работает:
Код:
#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
 
Автор
T

triceraptors

Новичок
Сообщения
4
Репутация
0
Re: нужно получать данные с КОМПОРТА

Спасибо за библиотеку, огромное !
уже работает,даже код почти не пришлось править ( и у вас слизанный тоже)

:( :(
... за предупреждение тоже, :whistle: торопился очень... не разглядел оЧепЯтку :-[ постараюсь не повторять такого :scratch:
 

Shadow

Новичок
Сообщения
1
Репутация
0
Re: нужно получать данные с КОМПОРТА

Подскажите где взять библиотеку CommMG.au3
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Re: нужно получать данные с КОМПОРТА

Shadow [?]
Подскажите где взять библиотеку CommMG.au3
Shadow почему бы вам не оформить новую тему?!
 

winstan

Эксплотатор)
Сообщения
406
Репутация
78
Re: нужно получать данные с КОМПОРТА

Shadow [?]
Подскажите где взять библиотеку CommMG.au3
поиск в помощь
http://www.mosaiccgl.co.uk/AutoItDownloads/confirm.php?get=COMMGv2.zip
 

kristow13

Новичок
Сообщения
76
Репутация
0
Добрый день!
я скачал библиотеку #include <CommMG.au3>
Мне необходимо передавать в com port запрос в hex формате.
И затем прочитать полученный ответ от прибора.
Вот такой запрос я отправляю: 0x40, 0x30, 0x35, 0x41, 0x35, 0x0d (отправка через терминал работает, а через autoit нет.)
А прочитать ответ в виде "FFFF56"
Помогите пожалуйста советом или кодом... :-[
 

ynbIpb

Скриптер
Сообщения
399
Репутация
109
Видимо вы используете _CommSendString
А для бинарных данных используется _CommSendByte
 

ssaamm

Новичок
Сообщения
2
Репутация
0
Выложите пожалуйста рабочую ссылку на <CommMG.au3> или перезалейте файл
 

alex33

Скриптер
Сообщения
1 457
Репутация
184
http://data.it-archiv.net/scripts/mSMSmodem/CommMG.au3
http://data.it-archiv.net/scripts/mSMSmodem/commg.dll
 
Верх