UART Kommunikation PC - AVR

Gast #2524
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.
Gast #2525
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!
Gast #2526
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
Gast #2527
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
Gast #2528
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
Gast #2529
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!
Gast #2530
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren