ASCII String von Barcodemodul über UART an µC

OP #3788923
Lesenswert?

Hallo liebe Gemeinde,

ich habe schon so einiges gesucht, aber irgendwie nicht das richte 
gefunden.

Ich habe ein Barcodemodul an die UART0 vom ATMega 644 angeschlossen und 
parallen mein DSO mit integr. RS232-konverter. Das BC-Modul schickt raus 
was es liest und am µC kommt auch was an.

Ich möchte einfach den empfangenen String (im Moment auf 10 Zeichen 
begrenzt) speichern.

Vielleicht funzt es so schon, aber ich kann es nicht kontrollieren, da 
ich die Variable string nicht "watchen" kann, es kommt im Watchfenster 
die meldung, das der Typ unbekannt ist (AVR-Studio 6, STK600, JTAGICE3)

Kann mir jmd helfen?

(ist erstmal alles ohne ISR....)



int main(void)
{
  char string[30];
  uint8_t puffer=0;
  uint8_t i=0;

    serial_init();

    while(i<10)
    {
        if(( UCSR0A & (1<<RXC0) ))
    {

      string[i]=UDR0;
                        i++;
    }


    }
}
OP #3789014
Lesenswert?

Habe ich gemacht, i wird hoch gezählt mit jedem eingescannten Barcode, 
aber in 2er schritten!

Also 2,4,6,8,10 die LSB-LED auf dem STK blinkt nur ganz kurz auf als ob 
das Barcodemodul gleich zwei Strings hintereinander sendet.

 while(i<10)
    {
        if(( UCSR0A & (1<<RXC0) ))
    {

      string[i]=UDR0;
                        i++;
                        PORTA=~i;
    }
OP #3789043
Lesenswert?

Also das Problem mit den zweierschritten ist geklärt, der Barcode hatte 
8 Zahlen (EAN8) und der Scanner hat noch ein Zeichen dran gehängt und 
somit war das UDR Register voll. Habe das anhängen von Zeichen am Modul 
deaktiviert.

Hat jmd ne idee wie ich den Inhalt von "string" im AVR sichtbar mache?
#3789223
Lesenswert?

Heiko K. schrieb:
> Also das Problem mit den zweierschritten ist geklärt, der Barcode hatte
> 8 Zahlen (EAN8) und der Scanner hat noch ein Zeichen dran gehängt und
> somit war das UDR Register voll. Habe das anhängen von Zeichen am Modul
> deaktiviert.
>
> Hat jmd ne idee wie ich den Inhalt von "string" im AVR sichtbar mache?

Wenn du gar nichts anderes hast, könntest du die empfangenen Zeichen ins 
EEPROM schreiben und vom AVR Studio aus den EPROM Inhalt auslesen.

Aber einfacher ist es, wenn du dir erst mal eine Anzeigemöglichkeit 
schaffst. UART zum PC, LCD, was auch immer.

Zur Not ginge auch eine Serie von 8 LED, 1 Taster und eine ASCII 
Tabelle, mit dem du dir die empfangenen Bytes in Binärform ausgeben 
lassen kannst. Aber das ist schon die absolute Hardcore Variante. 
Einfacher ist es, in einem Entwicklungssystem ein LCD zur Verfügung zu 
haben, selbst wenn dieses LCD danach wieder weg kommt, weil es im 
fertigen Gerät nicht gebraucht wird. Wenn man als Neuling denkt, man 
könne sich das alles sparen, dann merkt man sehr schnell, das man sich 
dabei selbst Prügel zwischen die Beine wirft.
#3789300
Lesenswert?

Heiko K. schrieb:
> Hat jmd ne idee wie ich den Inhalt von "string" im AVR sichtbar mache?

Also:

Ich hab Problem nachvollziehen können und eine eventuelle Lösung 
gefunden.

benötigt wird eine temporäre Variable nennen wir sie mal temp

1
int main(void)
2
char temp=0;
3
{
4
  char string[30];
5
  uint8_t puffer=0;
6
  uint8_t i=0;
7

8
    serial_init();
9

10
    while(i<10)
11
    {
12
       if(( UCSR0A & (1<<RXC0) ))
13
       {
14
       string[i]=UDR0;
15
       i++;
16
       }  
17
    }
18
    temp=string[0];  // Hier den Breakpoint setzen 
19
}

Anstatt jetzt die Pause-Taste zu drücken wird ein Breakpoint gesetzt.
Auf magische Weise wandelt sich die das "unknow identifier" in den Wert.
Warum das so ist, kann ich zugegebenermaßen nur spekulieren...

Ersatzweise kannst du dir auch die Adresse des Strings in einen Pointer 
schreiben, den im Watch angucken und damit dann im Memory-Fenster 
(Debug->Windows->Memory1) den Inhalt des Speichers an der Adresse 
ansehen. Da allerdings als Hex während, das im Watch-Fenster auch als 
Dec dargestellt wird.

Ich hoffe das hat geholfen.
OP #3789316
Lesenswert?

Super Tip,

da ich das STK600 nutze war das mit den LED´s nen mini-Umfang. Bei jedem 
BC-Scan wurde was anderes empfangen und ensprach laut ASCII-Tab nur 
Blödsinn. Da bin ich stutzig geworden und habe nochmal Baudrate, etc. 
überprüft.

    while(i<10)
    {

        if(( UCSR0A & (1<<RXC0) ))
    {

      string[i]=uart_getc();
                        i++;
                        PORTA=~i;
    }

    }


wenn ich jetzt einen BC mit 8 Ziffern scanne wird als Binärcode (via 
LED´s) auch eine 8 angezeigt!

Hat dann wohl geklappt, danke !

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