Forum: Mikrocontroller und Digitale Elektronik ASCII String von Barcodemodul über UART an µC


von René K. (tesla24)


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++;
    }


    }
}

von Peter II (Gast)


Lesenswert?

Heiko K. schrieb:
> Kann mir jmd helfen?

warum nicht einfach mal eine LED einschalten wenn etwas empfangen wurde.
1
string[i]=UDR0;
2
i++;
3
porta = i;


Vermutlich schickt der Leser am ende ein \n, damit kannst du prüfen ob 
etwas empfangen wurden.

von René K. (tesla24)


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;
    }

von René K. (tesla24)


Lesenswert?

nun weis ich leider noch nicht was in der variablen "string" nun am ende 
gespeichert ist...

von René K. (tesla24)


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?

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Bernhard F. (bernhard_fr)


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.

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Heiko K. schrieb:
> nun weis ich leider noch nicht was in der variablen "string" nun am ende
> gespeichert ist...

Warum gibst du den String nicht über die serielle Schnittstelle aus und 
guckst dir das auf dem PC mit einem gescheiten Terminalprogramm (z.B. 
HTerm) an?

von René K. (tesla24)


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 !

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
Noch kein Account? Hier anmelden.