Что нового

Отправка и получение данных с COM порта

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Спустя два месяца пришла ардуина... :smile:
Теперь хочу соединить AutoIt с ней, и попробовать передать и получить с нее информацию.
Пробовал:
Код:
#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
Не работает. Ошибка подключения к COM порту пишет. В ini правильно указал порт, а все равно не работает. Какие есть еще варианты?


Добавлено:
Сообщение автоматически объединено:

Никто не знает?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Клуб телепатов еще не открыт как бы..
 
Автор
_Lexa98_

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
inververs
Всмысле? Я показал почему не работает, что выдает ошибку. Спросил, какие есть еще варианты связи с COM портом?
 

Arses

Новичок
Сообщения
3
Репутация
1
Недавно столкнулся с подобной проблемой под Win7x64 (скрипт вылетал с ошибкой с предложением поискать решение проблемы в интернете), под Win7x86 работал нормально.
Решил использованием предыдущей версии COMMG_V2.89 вместо 90ой.
 
Автор
_Lexa98_

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Arses
А где можно взять предыдущую версию?
 

Arses

Новичок
Сообщения
3
Репутация
1
Выложил сюда:

Еще могу предложить свой код для работы с этой библиотекой.

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

#include "CommMG.au3"

$COMPort = 0
$COMPort = SetupPort($COMPort, Default, Default, Default, Default, Default)
If $COMPort = 0 Then MsgBox(0, "Error", "Can not connect to COM port", 0)

Func SetupPort($a_port = 0, $a_baud = 9600, $a_data = 8, $a_parity = 0, $a_stop = 1, $a_flow = 2)
    Local $en_baud = False, $en_data = False, $en_stop = False, $en_parity = False, $en_flow = False
    If $a_port = Default Then $a_port = 0
    If $a_baud = Default Then
        $en_baud = True
        $a_baud = 9600
    EndIf
    If $a_data = Default Then
        $en_data = True
        $a_data = 8
    EndIf
    If $a_stop = Default Then
        $en_stop = True
        $a_stop = 1
    EndIf
    If $a_parity = Default Then
        $en_parity = True
        $a_parity = 0
    EndIf
    If $a_flow = Default Then
        $en_flow = True
        $a_flow = 2
    EndIf
    If _CommPortConnection() <> "" Then _CommClosePort()
    Local $sErr
    If $a_port <> 0 Then
        _CommSetPort($a_port, $sErr, $a_baud, $a_data, $a_parity, $a_stop, $a_flow)
        If $sErr = "" Then
            SetError(0)
            Return $a_port
        Else
            ;EReport($sErr, "ret")
        EndIf
    EndIf
    Local $COM, $I, $comString = ""
    $COM = _CommListPorts(0)
    If @error <> 0 Then
        EReport("COM Port error, could not list any ports.", "ret")
        SetError(1)
        Return
    EndIf
    For $I = 1 To $COM[0] Step 1
        $comString &= $COM[$I] & "|"
    Next
    $comString = StringTrimRight($comString, 1)
    #Region GUI
    Local $SPForm, $cmb_Port, $cmb_baud, $cmb_data, $cmb_stop, $cmb_parity, $cmb_flow
    Local $Label1, $Label2, $Label3, $Label4, $Label5, $Label6, $btn_OK, $btn_Cancel
    Opt("GUIOnEventMode", 0)        ;0=disabled, 1=OnEvent mode enabled
    #Region ### START Koda GUI section ### Form=D:\!Project!\RS232\SCP.kxf
    $SPForm = GUICreate("COM port setup", 139, 178, 330, 344, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE))
    $cmb_Port = GUICtrlCreateCombo("", 70, 5, 64, 25)
    $cmb_baud = GUICtrlCreateCombo("", 70, 29, 64, 25)
    $cmb_data = GUICtrlCreateCombo("", 70, 53, 64, 25)
    $cmb_stop = GUICtrlCreateCombo("", 70, 77, 64, 25)
    $cmb_parity = GUICtrlCreateCombo("", 70, 101, 64, 25)
    $cmb_flow = GUICtrlCreateCombo("", 70, 125, 64, 25)
    GUICtrlSetState($cmb_baud, _Iif($en_baud, $GUI_ENABLE, $GUI_DISABLE))
    GUICtrlSetState($cmb_data, _Iif($en_data, $GUI_ENABLE, $GUI_DISABLE))
    GUICtrlSetState($cmb_stop, _Iif($en_stop, $GUI_ENABLE, $GUI_DISABLE))
    GUICtrlSetState($cmb_parity, _Iif($en_parity, $GUI_ENABLE, $GUI_DISABLE))
    GUICtrlSetState($cmb_flow, _Iif($en_flow, $GUI_ENABLE, $GUI_DISABLE))
    $Label1 = GUICtrlCreateLabel("COM Port", 4, 8, 64, 17, $SS_CENTER)
    $Label2 = GUICtrlCreateLabel("Baud Rate", 4, 32, 64, 17, $SS_CENTER)
    $Label3 = GUICtrlCreateLabel("Data Bits", 4, 56, 64, 17, $SS_CENTER)
    $Label4 = GUICtrlCreateLabel("Stop Bits", 4, 80, 64, 17, $SS_CENTER)
    $Label5 = GUICtrlCreateLabel("Parity", 4, 104, 64, 17, $SS_CENTER)
    $Label6 = GUICtrlCreateLabel("Flow Control", 4, 129, 64, 17, $SS_CENTER)
    $btn_OK = GUICtrlCreateButton("OK", 70, 152, 65, 21, 0)
    $btn_Cancel = GUICtrlCreateButton("Cancel", 4, 152, 64, 21, 0)
    GUICtrlSetState($btn_OK, $GUI_FOCUS)

    #EndRegion ### END Koda GUI section ###
    #EndRegion GUI
    $a_parity = StringConvert($a_parity, "0|1|2|3|4", "None|Odd|Even|Mark|Space")
    $a_stop = StringConvert($a_stop, "1|15|2", "1|1.5|2")
    $a_flow = StringConvert($a_flow, "0|1|2", "Hardware|XON/XOFF|NONE")
    GUICtrlSetData($cmb_Port, $comString, _CommPortConnection())
    GUICtrlSetData($cmb_baud, "50|75|110|150|600|1200|1800|2000|2400|3600|4800|7200|9600|10400|14400|15625|19200|28800|38400|56000|57600|115200|128000|256000", $a_baud)
    GUICtrlSetData($cmb_data, "5|6|7|8|9", $a_data)
    GUICtrlSetData($cmb_stop, "1|1.5|2", $a_stop)
    GUICtrlSetData($cmb_parity, "None|Odd|Even|Mark|Space", $a_parity)
    GUICtrlSetData($cmb_flow, "Hardware|XON/XOFF|NONE", $a_flow)
    GUISetState(@SW_SHOW)
    Do
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $btn_Cancel
                GUIDelete($SPForm)
                SetError(1)
                Return
            Case $btn_OK
                $comString = GUICtrlRead($cmb_Port)
                $a_baud = GUICtrlRead($cmb_baud)
                $a_data = GUICtrlRead($cmb_data)
                $a_stop = GUICtrlRead($cmb_stop)
                $a_parity = GUICtrlRead($cmb_parity)
                $a_flow = GUICtrlRead($cmb_flow)
                $comString = StringReplace($comString, "COM", "", 0, 0)
                $a_data = GUICtrlRead($cmb_data)
                $a_stop = StringConvert($a_stop, "1|1.5|2", "1|15|2")
                $a_parity = StringConvert($a_parity, "None|Odd|Even|Mark|Space", "0|1|2|3|4")
                $a_flow = StringConvert($a_flow, "Hardware|XON/XOFF|NONE", "0|1|2")
                GUIDelete($SPForm)
                Opt("GUIOnEventMode", 1)        ;0=disabled, 1=OnEvent mode enabled
                _CommSetPort($comString, $sErr, $a_baud, $a_data, $a_parity, $a_stop, $a_flow)
                If $sErr = "" Then
                    ;$COMPort = $comString
                    SetError(0)
                    Return $comString
                Else
                    SetError(1)
                    Return 0
                EndIf
            Case Else
                Sleep(25)
        EndSwitch
    Until False
EndFunc   ;==>SetupPort

Func EReport($e = @ScriptLineNumber, $action = "Exit")
	MsgBox(16, @ScriptName & " - error message", $e, 0)
	If $action = "Exit" Then Exit
	Return
EndFunc   ;==>EReport

Func StringConvert($val, $t1, $t2)
	Local $I, $t1a, $t2a
	$val = String($val)
	$t1a = StringSplit($t1, "|", 0)
	$t2a = StringSplit($t2, "|", 0)
	If Not IsArray($t1a) And IsArray($t2a) Then
		SetError(1)
		Return $val
	EndIf
	If $t1a[0] <> $t2a[0] Then
		SetError(1)
		Return $val
	EndIf
	For $I = 1 To $t1a[0] Step 1
		If $val = $t1a[$I] Then
			SetError(0)
			Return $t2a[$I]
		EndIf
	Next
	SetError(1)
	Return $val
EndFunc   ;==>StringConvert
 
Автор
_Lexa98_

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Arses
Написал свой вариант :smile: Включает и выключает лампочку :smile:
Код:
#include <GUIConstantsEx.au3>
#Include <CommMG.au3>

Local $sErr
$connect = _CommSetPort(4, $sErr, 9600, 8, 0, 1, 0, 0, 0)
$Form1 = GUICreate("LED", 125, 75)
$Button1 = GUICtrlCreateButton("Включить", 8, 8, 105, 25)
$Button2 = GUICtrlCreateButton("Выключить", 8, 40, 105, 25)
GUISetState(@SW_SHOW)
While 1
   $nMsg = GUIGetMsg()
	Switch $nMsg
		 Case $GUI_EVENT_CLOSE
			_Exit()
		 Case $Button1
			_CommSendString('1')
		 Case $Button2
			_CommSendString('0')
	EndSwitch
WEnd

Func _Exit()
   _CommSendString('0')
   _CommCloseport()
   Exit
EndFunc
 

Arses

Новичок
Сообщения
3
Репутация
1
Рад, что получилось! Все гениальное просто ) :IL_AutoIt_1:
А вот у меня пока все в процессе, пишу программу для общения с подобными устройствами, специализированный терминал.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
На офф сайте, есть программатор arduino с gui. Может будет полезным.
http://www.autoitscript.com/forum/topic/138727-arduino-gui-programmer/page__hl__%20arduino
 
Верх