02.05.2017, 18:36
Es gibt zwar schon einige UDFs, die sich mit der seriellen Schnittstelle befassen, aber ich wollte eine kleine und vor allem einfache UDF für den Datenaustausch (AutoIt <-> Arduino).
Man kommt da schon mit wenigen Befehlen aus (Open, Close, Send, Receive). Da sind die anderen UDFs schon viel zu "overkill".
Im Anhang befindet sich die UDF, die man lediglich in sein Script includen muss.
Hier mal das Beispiel für den Arduino:
Und das AutoIt-Beispiel-Script:
Man kommt da schon mit wenigen Befehlen aus (Open, Close, Send, Receive). Da sind die anderen UDFs schon viel zu "overkill".
Im Anhang befindet sich die UDF, die man lediglich in sein Script includen muss.
Hier mal das Beispiel für den Arduino:
Show ContentArduino Quellcode:
char CommandBuffer[6];
const char Command1[] = "GetAdd";
const char Command2[] = "LEDoff";
const char Command3[] = "LEDon ";
struct tAddress {
byte Nummer;
char Name[20];
char Strasse[20];
char PLZ[5];
char Wohnort[20];
byte Alter;
};
struct tAddress Address;
void setup() {
Serial.begin(230400);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
// Struktur mit Beispieldaten fuellen
Address.Nummer = 1;
strcpy(Address.Name, "Alfons Meier");
strcpy(Address.Strasse, "Koenigstr. 10");
strcpy(Address.PLZ, "45678");
strcpy(Address.Wohnort, "Bellhausen");
Address.Alter = 42;
}
void loop() {
if (Serial.available()) {
Serial.readBytes(CommandBuffer, sizeof(CommandBuffer));
if (strncmp(CommandBuffer, Command1, 6) == 0) {
Serial.write((byte*)&Address, sizeof(Address));
Serial.flush();
}
if (strncmp(CommandBuffer, Command2, 6) == 0) {
digitalWrite(LED_BUILTIN, LOW);
Serial.write(Command2);
Serial.flush();
}
if (strncmp(CommandBuffer, Command3, 6) == 0) {
digitalWrite(LED_BUILTIN, HIGH);
Serial.write(Command3);
Serial.flush();
}
}
}
Show ContentAutoIt-Quellcode:
Und das AutoIt-Beispiel-Script:
#include "SerialComm.au3"
Global $hPort = _SerialCommOpenPort('COM4', 1000, 115200) ; den seriellen Port oeffnen
If @error Then Exit ConsoleWrite('Fehler Nr.: ' & @error & @CR)
MsgBox(0, 'Test', 'Beispiel 1:' & @CRLF & 'Eine Datenstruktur wird vom Arduino empfangen.')
Global $iTimer, $iBytes, $tSend, $tReceive
; Beispiel 1: Es wird "GetAdd" an den Arduino gesendet und dieser sendet dann eine Struktur an Daten zurueck
Global Const $tagADDRESS = 'struct;' & _ ; in dieser Form werden die Daten empfangen (die gleiche Struktur wie beim Arduino)
'byte Nummer;' & _
'char Name[20];' & _
'char Strasse[20];' & _
'char PLZ[5];' & _
'char Wohnort[20];' & _
'byte Alter;' & _
'endstruct'
$tReceive = DllStructCreate($tagADDRESS) ; den Empfangspuffer (67 Byte) erstellen
$tSend = DllStructCreate('byte[6]') ; Sendepuffer erstellen (der Arduino erwartet ein 6 Byte langes Kommando)
DllStructSetData($tSend, 1, 'GetAdd') ; das Kommando "GetAdd" in den Sendepuffer schreiben
$iTimer = TimerInit()
$iBytes = _SerialCommSendData($hPort, $tSend) ; und an den Arduino senden
ConsoleWrite('Zeit (gesendet) : ' & Round(TimerDiff($iTimer), 3) & ' Bytes: ' & $iBytes & @CR)
ConsoleWrite('Daten (gesendet) : "' & BinaryToString(DllStructGetData($tSend, 1)) & '"' & @CR)
$iTimer = TimerInit()
$iBytes = _SerialCommReceiveData($hPort, $tReceive) ; die Daten werden empfangen
ConsoleWrite('Zeit (empfangen): ' & Round(TimerDiff($iTimer), 3) & ' Bytes: ' & $iBytes & @CR)
ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Nummer') & '"' & @CR)
ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Name') & '"' & @CR)
ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Strasse') & '"' & @CR)
ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'PLZ') & '"' & @CR)
ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Wohnort') & '"' & @CR)
ConsoleWrite('Daten (empfangen): "' & DllStructGetData($tReceive, 'Alter') & '"' & @CR)
; die Strukturen loeschen
$tSend = 0
$tReceive = 0
MsgBox(0, 'Test', 'Weiter mit Beispiel 2:' & @CRLF & 'Die Onboard-LED des Arduino blinkt 10 mal.')
; Beispiel 2: es werden abwechselnd immer LEDon und LEDoff als Kommando an den Arduino gesendet
$tSend = DllStructCreate('byte[6]') ; Sendepuffer erstellen (der Arduino erwartet ein 6 Byte langes Kommando)
$tReceive = DllStructCreate('byte[6]') ; Empfangspuffer erstellen (der Arduino sendet eine 6 Byte lange Bestaetigung zurueck)
For $i = 0 To 9
DllStructSetData($tSend, 1, 'LEDon ') ; das Kommando zum einschalten der LED in den Sendepuffer schreiben
$iTimer = TimerInit()
$iBytes = _SerialCommSendData($hPort, $tSend) ; das Kommando senden
ConsoleWrite('Zeit (gesendet) : ' & Round(TimerDiff($iTimer), 3) & ' Bytes: ' & $iBytes & @CR)
ConsoleWrite('Daten (gesendet) : "' & BinaryToString(DllStructGetData($tSend, 1)) & '"' & @CR)
$iTimer = TimerInit()
$iBytes = _SerialCommReceiveData($hPort, $tReceive) ; die Bestaetigung vom Arduino empfangen
ConsoleWrite('Zeit (empfangen): ' & Round(TimerDiff($iTimer), 3) & ' Bytes: ' & $iBytes & @CR)
ConsoleWrite('Daten (empfangen): "' & BinaryToString(DllStructGetData($tReceive, 1)) & '"' & @CR & @CR)
Sleep(250)
DllStructSetData($tSend, 1, 'LEDoff'); das Kommando zum ausschalten der LED in den Sendepuffer schreiben
$iTimer = TimerInit()
$iBytes = _SerialCommSendData($hPort, $tSend) ; das Kommando senden
ConsoleWrite('Zeit (gesendet) : ' & Round(TimerDiff($iTimer), 3) & ' Bytes: ' & $iBytes & @CR)
ConsoleWrite('Daten (gesendet) : "' & BinaryToString(DllStructGetData($tSend, 1)) & '"' & @CR)
$iTimer = TimerInit()
$iBytes = _SerialCommReceiveData($hPort, $tReceive) ; die Bestaetigung vom Arduino empfangen
ConsoleWrite('Zeit (empfangen): ' & Round(TimerDiff($iTimer), 3) & ' Bytes: ' & $iBytes & @CR)
ConsoleWrite('Daten (empfangen): "' & BinaryToString(DllStructGetData($tReceive, 1)) & '"' & @CR & @CR)
Sleep(250)
Next
; die Strukturen loeschen
$tSend = 0
$tReceive = 0
_SerialCommClosePort($hPort)
Hinweise:
Ich benutze für den Arduino die Arduino-IDE.
Für AutoIt benutze ich die aktuelle AutoIt-Version sowie SciTE4AutoIt3.
Eine Hilfe kann ich nur auf Basis dieser Software leisten.
Ich benutze für den Arduino die Arduino-IDE.
Für AutoIt benutze ich die aktuelle AutoIt-Version sowie SciTE4AutoIt3.
Eine Hilfe kann ich nur auf Basis dieser Software leisten.