Zuviel vom Eeprom gelesen?

OP #2182804
Lesenswert?
• ▲
▼
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
OP #2182865
Lesenswert?
• ▲
▼
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.