Forum: PC-Programmierung Arduino serielle Kommunikation


von Tobias M. (Firma: Student) (tobi_ros)


Lesenswert?

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
}

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

was passiert denn genau? Was wird liefert das Programm denn als 
ausgaben?

ReadFile müsste blockieren bis etwas zum lesen das ist.

von Tobias M. (Firma: Student) (tobi_ros)


Lesenswert?

Ach ja, das Problem hatte ich gar nicht direkt benannt. Also es wird 
Zyklisch eine Abfolge

schreibe_seriell('Z');
B=lese_seriell();

ausgeführt. Das Verhalten ist unterschiedlich. In B steht mal das 
Richtige, mal nichts (obwohl etwas empfangen wurde..) und manchmal 
blockiert die Funktion . Eigentlich müsste ja bei jedem Zyklusaufruf das 
richtige Zeichen empfangen werden. In meinem Fall also '4'. An der 
Schnittstelle kommt definitiv das Richtige an. Wenn ich mit HTerm ein 
'Z' sende antwortet der Arduion immer mit '4'.

von Tobias M. (Firma: Student) (tobi_ros)


Lesenswert?

Hat sich erledigt ;)

ich hatte nicht beachtet, dass Serial.println() ein \r\n an das Zeichen 
hängt. Mit Serial.write() funktioniert es!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.