Forum: Mikrocontroller und Digitale Elektronik UART Kommunikation PC - AVR


von Morty Brown (Gast)


Lesenswert?

Hi,

wir wollen binaere Daten zwischen PC und Atmel AVR-Serie hin und 
herschaufeln.
Die Kommunikation funktioniert gut im Hyperterminal, aber bei Visual C++ 
kommt hauptsächlich Mist auf der Gegenseite an.
Wer hat Erfahrung mit dem DCB der WINAPI?
Wir haben unserer Meinung nach schon alles wichtige initilisiert (9600, 
... kein Handshake...).
Wer hats geschafft ohne Terminal-Programm mit dem Atmel zu 
kommunizieren, wo koennte unser Fehler liegen?
Thanks in advance, yours Morty Brown.

von Ingo B. (Gast)


Lesenswert?

Hi,

habe ich schon mal gemacht, allerdings mit dem C++ Builder.

Könnte ihr überhaupt vom PC Zeichen senden oder empfangen?

Vielleicht einfach mal pin 2 mit pin 3 der seriellen Schnittstelle 
verbinden, dann sollten alle gesendeten Daten sofort wieder empfangen 
werden.

Bis dann,
Ingo!

von Morty Brown (Gast)


Lesenswert?

Von PC zu PC laeuft alles perfekt (ueber 0-Modem-Kabel), auch von Atmel 
auf Hyperterminal und umgekehrt laueft alles gut, nur von unserem 
Programm zum Atmel und umgekehrt is Mist.
Beispiel:
ABCDEFGHI.. zum Atmel senden und dort ins EEPROM schreiben.
Schaut man sich den EEPROM-Inhalt an, dann steht z.B. folgendes:
ABDGI... drin.
Wie gesagt mitm TerminalProgramm haut das alles hin.
Folglich muesste wohl noch was am Setup der seriellen Schnittstelle in 
der WinApi was faul sein, aber was?
Alle Handshakes sind aus, Baud und Paritaet usw. is OK, also ich weiss 
echt nicht mehr wo hier der Fehler liegt!
Auf jeden Fall schon mal vielen Dank fuer die Bemuehungen.
CU

von Siegfried (Gast)


Lesenswert?

Mal testweise eine Pause von 2 ms zwischen den einzelnen Zeichen 
einbauen. Vielleicht stimmt die Framelänge beider Rechner nicht überein
(Startbit + 8 Datenbits + Parity + 1 oder 2 Stopbit).

Weil das Emfpfängerregister mit dem Startbit losläuft, kann es sein, das 
der gesendete Frame länger ist als der, den der Empfänger erwartet. 
Folge: das Startbit des nächsten Zeichens wird nicht erkannt.

Siegfried

von Meiserl (Gast)


Lesenswert?

Hi

Ich hab die Schnittstelle (über API) schon öfters mit Delphi 
initialisiert und funktioniert tadellos.

vielleicht hilft dir der code ja weiter..


  if port='' then port:='Com1';
  getmem(f,20);
  strpcopy(f,port);
  if not portopen then
     HComm:=CreateFile(f,GENERIC_READ or 
GENERIC_WRITE,0,t,OPEN_EXISTING,0,0);
  freemem(f);
  PortOpen:=false;
  if HComm=INVALID_HANDLE_VALUE then
    MessageDlg('error opening '+port,mtInformation,[mbOk],0)
    else
    begin
       PortOpen:=true;
       keys;
     { initialisieren }
       p:=addr(DCB);
       FillMemory(p,SizeOf(DCB),0);
       DCB.DCBLength:=sizeof(DCB);
       GetCommState(HComm,DCB);
       DCB.DCBLength:=8;DCB.BAudRate:=CBR_2400;
       SetCommState(hComm,DCB);
       TimeOuts.ReadIntervalTimeOut:=20;
       TimeOuts.ReadTotalTimeoutMultiplier:=10;
       TimeOuts.ReadTotalTimeoutConstant:=100;
       TimeOuts.WriteTotalTimeoutMultiplier:=10;
       TimeOuts.WriteTotalTimeoutConstant:=100;
       SetCommTimeOuts(HComm,TimeOuts);
{       if (not BuildCommDCB('2400,N,8,1',DCB)) then
       begin
         PortGeoeffnet:=False;
         PortGeoefnetIntern:=False;
         MessageDlg('Fehler',mtInformation,[mbOk],0);
       end;}



... schau auch mal bie http://www.sysinternals.com vorbei.
Der Portmon hat mir manchmal schon sehr geholfen.

gutes gelingen

von Ingo B. (Gast)


Lesenswert?

Hi,

hast Du beim AVR einen Empfangsbuffer eingebaut?
Vielleicht 'überfährtst' du ja den Controller, immerhin müssen die Daten 
ja ins EEPROM geschrieben werden. Das dauert etwas....
Das würde auch erklären, warum es mit einem Terminalprogramm läuft, da 
bist du ja wesentlich langsamer.

Bis dann,
Ingo!

von Morty Brown (Gast)


Lesenswert?

Hi, Meiserl:
Den Portmonitor werden wir mal ausprobieren, das Delphi File ist in den 
Abschnitten wo es auf die Winapi zugreift (dcb.xx) ziemlich aehnlich zu 
unserem. Ich hab da auch schon alle verfügbaren Elemente explizit 
initialisiert, aber auch das hat nix gebracht.
Hi Ingo:
OK werde das mal ausprobieren, aber ich vermute daran liegts nicht.
Der AVR verliert immer gleich viel Zeichen, egal ob mit 115000 oder 2400 
baud gearbeitet wird, auch wenn ich nicht ins EEPROM sondern in 
irgendeine Variable schreibe.
Vielleicht einfach mal per Software eine Pause zwischen den einzelnen 
Zeichen lassen, aber das kanns eigentlich nicht sein.
Bis denn!

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.