mikrocontroller.net

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


Autor: Dave_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henning Schreiber (xtsi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dave_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.