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.
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 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
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
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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.