Moin, ich habe ein 128kB SPI EEprom an einem Atmega16. Ich sende über ein eigenes C++ Konsolen Programm eine Adresse an den Atmega und dieser sendet dann 9228 Bytes an den PC. Hier werden diese Daten von dem Konsolenprogramm in eine Datei geschrieben. Das Problem ist dass oftmals die Verbindung hängen bleibt und ich dann den Seriellen Schnittstelle zu USB Adapter ab- und wieder ranmachen muss. In den anderen Fällen funktioniert die Übertragung tadellos. Ich habe auch die Funktion implementiert, dass nur ein einziges Byte gelesen wird. Hier das selbe Prinzip, erst die Adresse senden, dann 1 Byte empfangen. Hier jedoch funtioniert es scheinbar ohne jegliche Probleme. Ich schließe aus, dass es am Atmega liegt, da ich den anlasse und nach ab- und anschließen des Adapters alles wieder funktioniert. Warum bricht die Verbindung zusammen bzw. warum hängt sich der Adapter auf? Baudrate ist 115200. Ich mache keine Empfangskontrolle, Adresse senden und Daten senden, jedoch wenn ich ein Zeichen empfangen will (Konsole), wiederholt er den Vorgang bis min. ein Zeichen im Puffer ist - die Verarbeitung der Daten ist ja wesentlich schneller als der Sendevorgang. mfg, Nils
Hi, schon mal statt der Daten vom EEPROM einfach Dummy-Daten versendet? Tritt der Fehler dann auch auf? Gibt es bei den Interrupts von USART und SPI Deadlocks? Carsten
Auch bei Dummydaten hört die Übertragung mittendrin auf und die empfangene Datei ist unvollständig und keine 9228 Bytes groß. Wiegesagt, wenn ich dann den Adapter ab und wieder ranmache, ohne den Atmega zu reseten, funktioniert die serielle Schnittstelle wieder. Hier mal ein paar Auszüge - Code stelleneise weggelassen; Insbesondere ist die Getch() so in Ordnung? (ganz unten): Hier der Code vom Atmega, wenn ein Uart Zeichen empfangen wurde (löst Interrupt aus):
1 | void bild_op(unsigned char stat,unsigned char op){ |
2 | union{ |
3 | unsigned char _byte[4]; |
4 | unsigned long _long; |
5 | }addr; |
6 | unsigned int x,y; |
7 | |
8 | addr._byte[2] = getch(); //Adresse beziehen |
9 | addr._byte[1] = getch(); |
10 | addr._byte[0] = getch(); |
11 | |
12 | wait_a(addr._byte[2]); |
13 | |
14 | init_op(addr._byte,op); //IC auf gesendete Adresse lesen/schreiben vorbereiten |
15 | |
16 | if(stat == 0){ |
17 | write(getch()); |
18 | }
|
19 | |
20 | close_ic(addr._byte[2]); |
21 | }
|
22 | |
23 | befehl = getch(); |
24 | |
25 | if(befehl == 'A') bild_op(0,0); |
26 | else putch(ERROR); |
hier die zugehörigen Funktionen der Konsole:
1 | void CTransfer::readfile(unsigned long adresse,const char* datei){ |
2 | fstream filestream(datei, ios::out|ios::trunc); |
3 | filestream.close(); |
4 | filestream.open(datei, ios::in|ios::out); |
5 | |
6 | init_verbindung(adresse,2); |
7 | for(int x=0;x<9228;x++){ |
8 | filestream << Getch(); |
9 | }
|
10 | }
|
11 | |
12 | void CTransfer::init_verbindung(unsigned long adresse,unsigned char mode){ |
13 | addr._long = adresse; |
14 | if(mode == 0) Putch('A'); |
15 | Putch(addr._byte[2]); |
16 | Putch(addr._byte[1]); |
17 | Putch(addr._byte[0]); |
18 | }
|
19 | |
20 | unsigned char CSerialPort::Getch(){ |
21 | unsigned char str[1]; |
22 | do{ |
23 | ReadFile(hSerial,str,1,&dwbytesread,NULL); |
24 | |
25 | }while(dwbytesread == 0); |
26 | return str[0]; |
27 | }
|
Da ich nicht mehr editieren kann: Achja, wenn ich über Hyperterminal die Datei schicke, bricht die Verbindung auch zusammen nach einer ungewissen Anzahl Bytes. Kann es an meinem Apadater liegen?
falls das ein prolific-Dingen ist: ja. Das Zeug ist Müll. Mit FDTI-Chips hatte ich noch keine Probleme.
Kann die Probleme bei dem billigsten USB-Seriell-Wandlern bestätigen. Mit genau dem Symptom, dass mittendrin der Datenstrom abbreißt und der "Endpoint" auf nichts mehr reagiert. http://de.wikipedia.org/wiki/Lehrgeld =)
Ach Lehrgeld^^. Ich hab den doch umsonst bekommen^^.Ich versuch es mal am richtigen Seriellen Port vom Desktop Pc :D. EDIT: Ok am Tower PC bricht die Verbindung NICHT ab. SOviel dazu..
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.