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


von I. L. (Gast)


Lesenswert?

Moin Jungs,

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

Hier der Code:
1
#define USART_RX_BUFFER_SIZE 6         // Puffergröße für Benutzerkommandos
2
uint8_t USART_RxBuf[USART_RX_BUFFER_SIZE];   // Lesepuffer für Benutzerkommandos
3
void empfangenen_string_auswerten (uint8_t temp[USART_RX_BUFFER_SIZE])
4
{
5
  if (strncmp(temp, "DL", 2)==0)          // Gültiges Zeichen 
6
    {
7
    SETBIT(PORTC,PC0);
8
    if (temp[2] == (DIP + 48))           // Ja, richrtige Platine
9
      {
10
      //CLEARBIT (PORTC,PC0);
11
      set_chanel((temp[3]*10)+temp[4]);    // Ja, Kanal aus String lesen
12
      set_supply(temp[5]);          // Versorgung aus String lesen
13
      }
14
    }
15
}
16
17
//  ****************************************************************************
18
//  Byte empfangen
19
  SIGNAL (SIG_UART_RECV)
20
{
21
  //if (PINC & (1 << PC0)) {PORTC &= ~(1 << PC0);}        // LED an? Wenn ja, dan aus machen
22
  //else {PORTC |= (1 << PC0);}                  // Wenn nicht an, dann an machen
23
  unsigned char data;
24
  data = UDR; // Daten auslesen    
25
   
26
  // Daten im Lesepuffer um 1 weiterschieben
27
  for (uint8_t i=0; i<=USART_RX_BUFFER_SIZE-2; i++) 
28
    {USART_RxBuf[i] = USART_RxBuf[i+1];}
29
    
30
  
31
  USART_RxBuf[USART_RX_BUFFER_SIZE-1] = data;  // neu empfangenes Zeichen einfügen
32
  empfangenen_string_auswerten (USART_RxBuf);  // auf empfangene Kommandos testen und ggf. umsetzen
33
}

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
1
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

von Karl H. (kbuchegg)


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!
1
SIGNAL (SIG_UART_RECV)
2
{
3
  unsigned char data;
4
  data = UDR; // Daten auslesen    
5
6
  USART_RxBuf[nextData] = data;
7
  nextData++;
8
9
  USART_RxBuf[nextData] = '\0';  // sicherheitshalber den "String" noch
10
                                 // abschliessen, falls sich jemand zwischendurch 
11
                                 // daran vergreifen will
12
}

Dein ganzes Auswertekonzept ist .... nicht gut.

von Ago (Gast)


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).

von I. L. (Gast)


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

von I. L. (Gast)


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

von Karl H. (kbuchegg)


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.

von I. L. (Gast)


Lesenswert?

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



Gruß Knut

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.