Hallo, ich möchte einen Arduino zu Steuerung einer Anlage benutzen. Zur Benutzereigabe habe ich eine grafische Oberfläche mit gtk+ in C erstellt. Daten zwischen PC und Arduino sollen Byte-weise seriell übertragen werden. Der Ablauf soll zunächst sein PC sendet 'Z' und der Arduino antwortet mit '4'. Das Senden an den Arduino funktioniert problemlos. Jedoch habe ich Probleme in die Andere Richtung. Ich denke mir fehlt in der Funktion "seriell_lesen" eine abfrage ähnlich wie auf dem Arduino: if(Serial.available()>0) {;} Kennt jemand den Befehl für Win32? Hier die Funktionen: Lesen in PC wird zyklisch durch einen Task ausgeführt:
1 | #include <stdlib.h> |
2 | #include <gtk/gtk.h> |
3 | #include <windows.h> |
4 | #include <string.h> |
5 | #include "gui_eg.h" |
6 | |
7 | char seriell_lesen(void) |
8 | {
|
9 | DCB dcb; //Block mit Flags |
10 | DWORD iBytesRead; //Anz gelesene Bytes |
11 | char zeichen_in; //zu lesendes Byte |
12 | BOOL fehler; |
13 | |
14 | HANDLE hCom = CreateFile ("COM9", GENERIC_READ /*| GENERIC_WRITE*/, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);//Oeffne Port "COM9" |
15 | if (hCom == INVALID_HANDLE_VALUE) |
16 | {
|
17 | puts("COM9 konnte nicht geoeffnet werden!"); |
18 | return 0; |
19 | }
|
20 | |
21 | dcb.DCBlength = sizeof(DCB); // Laenge des Blockes |
22 | GetCommState (hCom, &dcb); // COM-Einstellungen holen und aendern |
23 | dcb.BaudRate = 9600; // Baudrate |
24 | dcb.ByteSize = 8; // Datenbits |
25 | dcb.Parity = NOPARITY; // Parität |
26 | dcb.StopBits = ONESTOPBIT; // Stopbits |
27 | SetCommState (hCom, &dcb); // COM-Einstellungen speichern |
28 | |
29 | //Hier müsste nun abgefragt werden, ob im Buffer ein Byte abzuholen ist...
|
30 | |
31 | fehler=ReadFile (hCom, &zeichen_in, 1, &iBytesRead, NULL); // Senden einesBytes |
32 | if(!fehler) |
33 | {
|
34 | puts("Fehler beim lesen"); |
35 | return 0; |
36 | }
|
37 | else
|
38 | {
|
39 | printf("Gelesene Bytes:%d", iBytesRead); |
40 | }
|
41 | |
42 | CloseHandle (hCom); // COM schließen |
43 | printf("Gelesene Bytes:%d \n", iBytesRead); |
44 | |
45 | |
46 | |
47 | return zeichen_in; |
48 | }
|
Lesen/Schreiben Arduino:
1 | void_seriell_kom() |
2 | {
|
3 | if(Serial.available()>0){serial_byte_in=Serial.read();} |
4 | |
5 | if(serial_byte_in=='Z'){Serial.println(4);} |
6 | |
7 | }
|
8 | void loop() |
9 | {
|
10 | seriell_kom() |
11 | }
|