www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Mega8 funktioniert, ich verzweifele noch


Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Jungs,

ich bin am verzweifen mit meinem Mega8 und der USART-Schnittstelle.
Ich bekomme einfach den String nicht ausgewertet.

Hier der Code:
#define USART_RX_BUFFER_SIZE 6         // Puffergröße für Benutzerkommandos
uint8_t USART_RxBuf[USART_RX_BUFFER_SIZE];   // Lesepuffer für Benutzerkommandos
void empfangenen_string_auswerten (uint8_t temp[USART_RX_BUFFER_SIZE])
{
  if (strncmp(temp, "DL", 2)==0)          // Gültiges Zeichen 
    {
    SETBIT(PORTC,PC0);
    if (temp[2] == (DIP + 48))           // Ja, richrtige Platine
      {
      //CLEARBIT (PORTC,PC0);
      set_chanel((temp[3]*10)+temp[4]);    // Ja, Kanal aus String lesen
      set_supply(temp[5]);          // Versorgung aus String lesen
      }
    }
}

//  ****************************************************************************
//  Byte empfangen
  SIGNAL (SIG_UART_RECV)
{
  //if (PINC & (1 << PC0)) {PORTC &= ~(1 << PC0);}        // LED an? Wenn ja, dan aus machen
  //else {PORTC |= (1 << PC0);}                  // Wenn nicht an, dann an machen
  unsigned char data;
  data = UDR; // Daten auslesen    
   
  // Daten im Lesepuffer um 1 weiterschieben
  for (uint8_t i=0; i<=USART_RX_BUFFER_SIZE-2; i++) 
    {USART_RxBuf[i] = USART_RxBuf[i+1];}
    
  
  USART_RxBuf[USART_RX_BUFFER_SIZE-1] = data;  // neu empfangenes Zeichen einfügen
  empfangenen_string_auswerten (USART_RxBuf);  // auf empfangene Kommandos testen und ggf. umsetzen
}


Es wird ein String DL1010 gesendet und ich versage schon beim Abfragen 
des ""DL". Kann mir jemand helfen?


Ich weiß das der Rest fehlt, es geht auch nur um
if (strncmp(temp, "DL", 2)==0)          // Gültiges Zeichen 
bis hierher komme ich und dann wir die Bedingung "DL" nicht erfüllt.
Die Schaltung läuft aufm internen OSC, da dieser nicht so genau ist, 
habe ich mir den Takt ausgeben lassen => 995225 Hz.

Ich lasse mir den String von einem CR800 ausgeben, dass klappt auch und 
im Terminal kommt auch alles an. Was übersehe ich?

Gruß Knut

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:


> Es wird ein String DL1010 gesendet und ich versage schon beim Abfragen
> des ""DL". Kann mir jemand helfen?

Du hast schon beim Zusammenbau des Strings versagt.
Was machst du denn da für einen Unsinn.
Häng doch die Zeichen einfach hintereinander und gut ists!
Da brauchst du doch nichts rumschieben!
SIGNAL (SIG_UART_RECV)
{
  unsigned char data;
  data = UDR; // Daten auslesen    

  USART_RxBuf[nextData] = data;
  nextData++;

  USART_RxBuf[nextData] = '\0';  // sicherheitshalber den "String" noch
                                 // abschliessen, falls sich jemand zwischendurch 
                                 // daran vergreifen will
}

Dein ganzes Auswertekonzept ist .... nicht gut.

Autor: Ago (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> Ich weiß das der Rest fehlt, es geht auch nur umif (strncmp(temp, "DL", 2)==0) 
// Gültiges Zeichen
> bis hierher komme ich und dann wir die Bedingung "DL" nicht erfüllt.

Dann lass dir doch mal ausgeben, was dort stattdessen steht (oder steht 
da wirklich "DL" in den ersten 2 byte?)

Abgesehen davon wird das hier nicht funktionieren:
> if (temp[2] == (DIP + 48))           // Ja, richrtige Platine
>       {
>       //CLEARBIT (PORTC,PC0);
>       set_chanel((temp[3]*10)+temp[4]);    // Ja, Kanal aus String lesen
>       set_supply(temp[5]);          // Versorgung aus String lesen

Da temp[3] wohl offenbar ASCII und kein binärwert sein wird.
Also solltest du hier
set_channel(((temp[3]-48)*10 + (temp[4]-48));
setzen (vermute ich mal).

Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ago schrieb:
> Da temp[3] wohl offenbar ASCII und kein binärwert sein wird.
> Also solltest du hier
> set_channel(((temp[3]-48)*10 + (temp[4]-48));
> setzen (vermute ich mal).

Jep, danke hast natürlich recht!

Leider kann ich mir nichts anzeigen lassen habe nur den RXD im Layout 
drinnen, TXD wird nicht verwendet bzw für andere Sachen benötig sodass 
ich den nicht nutzen kann. Ich vermute das es irgendwas mit dem 
"Emofang" des Strings zu tun hat.

Aber was denn blos?




Gruß Knut

Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry KH, hab deinen Beitrag grad erst gesehn.
Hmm, dass is auf jedenfall plausibil was du da sagst!

Ich sollte das etwad er Fehler sein? Was genau hab ich denn falsch 
gemacht?



Gruß Knut

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:

> Leider kann ich mir nichts anzeigen lassen habe nur den RXD im Layout
> drinnen, TXD wird nicht verwendet bzw für andere Sachen benötig sodass
> ich den nicht nutzen kann. Ich vermute das es irgendwas mit dem
> "Emofang" des Strings zu tun hat.
>
> Aber was denn blos?

Hast du denn schon mal grundsätzlich kontrolliert, ob dein Empfang auf 
Zeichenebene richtig ist?

Egal wie du das machst:
TxD vom µC abklemmen und provisorisch einen Rückwärtskanal einrichten.
8 Led an einem Port an dem man das Bitmuster eines Zeichens sehen kann
LCD
Was auch immer, aber verschaff dir Einblick, was da tatsächlich aus dem 
UDR rauskommt.

Stochern im Nebel ist nie gut. Letzten Endes läuft es meistens 
irgendwann dann sowieso darauf hinaus, dass man sich eine Anzeige baut, 
egal wie die aussieht.

Autor: I. L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich werds morgen ma ausprobieren, hab die Hardware nicht am Man.
Danke aber trotzdem schonma!



Gruß Knut

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.