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

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