Forum: PC-Programmierung Empfangen von Daten mit einer C-Routine und RS232


von Dave_ (Gast)


Lesenswert?

Hallo zusammen.

Ich habe ein Problem. Ich möchte mit einer C-Routine Daten durch eine
RS232 Schnittstelle empfangen und in einem Zahlenfeld speichern. Das
Versenden der Daten funktioniert bereits.

Stand der Dinge: Ich habe einen Controler (ATMEGA168) mit welcchem ich
mit einer eingestellte Baudrate ein einfaches String z.B. 'R'
versende. Es ist eine Dauerschleife, so daß der Controller dauernd
'R' sendet. Mit einem Terminal kann ich die daten empfangen, dauernd
nur 'R'.

Habe mich mit der RS232 Schnittstelle beschäftigt. Befor man Daten mit
dieser Empfangen kann gilt es zunächst einige einstellungen
durchzuführen.


HANDLE OpenComm(char* Port)
{ // Öffnet den Port und gibt ein Handle zurück
HANDLE hCom = CreateFile(Port,    // z.B. "COM1",
GENERIC_READ|GENERIC_WRITE,       //zum Senden und Empfangen
                        0,        // Für comm devices exclusive-
                          // access notwendig
                        0,        // Keine security attributes
            OPEN_EXISTING,        // Für comm devices notwendig
                        0,        // Kein overlapped I/O
                        0);       // Für comm devices muss NULL sein
if (hCom == INVALID_HANDLE_VALUE)
ShowLastError("CreateFile: "+AnsiString(Port));
return hCom;


void SetDCB(HANDLE hCom)
{
DCB dcb;                                       // Device ControlBlock
BOOL fSuccess = GetCommState(hCom, &dcb);      // DCB lesen
if (!fSuccess) ShowLastError("GetCommState");
dcb.BaudRate = 9600;                           // Baudrate=9600
dcb.ByteSize = 8;                              // 8 Datenbits
dcb.Parity = NOPARITY;                         // keine Parity
dcb.StopBits = ONESTOPBIT;                     // 1 Stopbit
// SetCommState konfiguriert die serielle Schnittstelle
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess) ShowLastError("SetCommState");


void SetReadTimeouts(HANDLE hCom)
{
COMMTIMEOUTS t;
// Alle Wert in Millisekunden
// Werte für ReadFile:
t.ReadIntervalTimeout=100;       // Zeit zwischen zwei Zeichen
t.ReadTotalTimeoutMultiplier=0;  // pro Zeichen
t.ReadTotalTimeoutConstant=1;
// Werte für WriteFile: wenn beide 0 sind, kein Timeout
// beim Schreiben
t.WriteTotalTimeoutMultiplier=0;
t.WriteTotalTimeoutConstant=0;
if (!SetCommTimeouts(hCom,&t))
ShowLastError("SetCommTimeouts");



Diese Einstellungen muß man zum emfangen von Daten machen. Ich habe
Einstellungen beim Controller von :

Baudrate 115400 Baud
8 Datenbits
keine Parity
1 Stopbit

Und möchte die Daten mit der Routine

ReadFile(hComReceive, // handle des Com-Ports
                Data, // Adresse des Datenpuffers
                   n, // Anzahl der zu lesenden Bytes
  &NumberOfBytesRead, // Adresse übergeben
                  0); // kein overlapped I/O

empfanengen und das Data Datenpuffer in ein Zahlen feld speichern.

Ich hatte bis jetzt keinen Erfolg. Kann mir jemand sagen, welche
Einstellungen ich noch zu meinen Controllereinstellungen am PC
vornehmen muß bei den Enstellroutinen? Was hat es mit der Funktion
SetTimeouts auf sich?

David

von Blackbird (Gast)


Lesenswert?

Naja, 9600 Baud auf dem PC und 115200 Baud auf'm µC: das verträgt sich
schon mal nicht.
Dann macht es schon einen Unterschied, ob man 0 oder NULL verwendet.
Dann gibt es noch den Empfangspuffer:
BOOL SetupComm(
  HANDLE hFile,     // handle to communications device
  DWORD dwInQueue,  // size of input buffer
  DWORD dwOutQueue  // size of output buffer
);
Und wie willst Du die Datem empfangen? Polling oder ereignisgesteuert?
siehe auch hier:
http://www.mikrocontroller.net/forum/read-8-396803.html#new

Blackbird

von Henning S. (xtsi)


Lesenswert?

Sicher sollte man NULL und 0 rein aus Prinzip utnerscheiden, aber den
grossen Unterschied sollte es nicht machen ;)

windef.h

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

Aber:

115__4__00 und 9600 Baud vertragen siche wirklich nicht ;)

Und:

ReadFile(hComReceive, // handle des Com-Ports
                Data, // Adresse des Datenpuffers
                   n, // Anzahl der zu lesenden Bytes
  &NumberOfBytesRead, // Adresse übergeben
                  0); // kein overlapped I/O

Was steht in n?

Gruss,

XtSI

von Dave_ (Gast)


Lesenswert?

Danke für den Tipp mit der Baudrate, habe es Übersehen!!

Zu Deiner Funktion:

BOOL SetupComm(
  HANDLE hFile,     // handle to communications device
  DWORD dwInQueue,  // size of input buffer
  DWORD dwOutQueue  // size of output buffer
);

Mit dieser Funktion tue ich den Speicherplatz reservieren für die
ankommenden und abgehenden Daten.
Was soll es für einen Unterschied machen ob ich NULL oder 0 verwende?

Studiere eben Dein Programm.

David

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.