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!