Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Probleme mit Serial_ReadExt(0) Kategorie: Verschiedenes (von Franz-Peter - 4.01.2011 17:18)
Als Antwort auf Probleme mit Serial_ReadExt(0) von intron - 4.01.2011 16:32
Ich nutze:
C-Control Pro Mega32, C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> Hallo,
> mit einer PC-Software möchte ich PWM-Werte (3 PWM Kanäle mit je 8 Bit) über die RS232
> Schnittstelle an die C-Control Pro Mega32 übertragen. Die 3 Kanäle werden jeweils mit
> GroÃ?buchstaben 'R', 'G' und 'B' als ASCII-Zeichen kodiert, gefolgt von einem in 2 ASCII-Zeichen
> zerlegten Byte als PWM-Wert, also insgesamt 3 ASCII-Zeichen.
> Z.B.
> PWM-Kanal 0 mit Wert 0x49: gesendet wird: 'R'+'4'+'9'
> PWM-Kanal 1 mit Wert 0xA3: gesendet wird: 'G'+'A'+'3'
> PWM-Kanal 2 mit Wert 0x1F: gesendet wird: 'B'+'1'+'F'
> usw.
>
> zum Empfang der Daten benutze ich die interruptgesteuerte RS232 Konfiguration (Serial_Init_IRQ()).
> In einer while-Schleife wird gefragt, ob 3 Zeichen empfangen wurden. Wenn ja, wird 3mal die Funktion
> Serial_ReadExt(0) aufgerufen und die empfangenen ASCII-Werte in char-Variablen geschrieben:
>
>     while(1)
>     {if(Serial_IRQ_Info(0,RS232_FIFO_RECV)>=3)
>         {   color=Serial_ReadExt(0);     //1. Zeichen codiert Kanal,
>             value[0]=Serial_ReadExt(0);  //2. Zeichen codiert Highbyte des PWM-Wertes
>             value[1]=Serial_ReadExt(0);  //3. Zeichen codiert Lowbyte des PWM-Wertes
>             PWM=Str_ReadNum(value,16);   //zwei ASCII in hex konvertieren
>             .....
>
> in "color" wird entweder 'R', 'G' oder 'B' geschrieben, in das char-Array value[] die beiden
> ASCII-Zeichen des zerlegten byte für den PWM-Wert (z.B. 'R87' -> color='R', value[0]='8',
> value[1]='7'). Die Funktion Str_ReadNum(value,16) setzt dann das byte aus den beiden ASCII-Zeichen
> wieder zusammen (für das Beispiel ist PWM=0x87).
> Nun das eigentliche Problem:
> Für die Kanäle 0 und 1 (also 'R' und 'G') funktioniert es. Bei dem 3. Kanal ('B') funktioniert
> es nicht mehr, da die Funktion "Serial_ReadExt(0)" das ASCII-Zeichen 'B' aus irgendeinem Grund
> als Hexadezimalwert interpretiert. Ich habe das auch mit A, C, D, E, F bzw. a, b, c, d, e, f
> versucht, jedoch mit dem gleichen Ergebnis.
> Gibt es eine Möglichkeit, alle Zeichen einheitlich als ASCII-Werte zu lesen bzw. zu interpretieren
> bzw. einen "Programmiertrick", um dieses Problem zu umgehen (am einfachsten ist es - und es geht
> auch so - ist natürlich, wenn der Kanal nicht mit 'B' sondern mit einen Nicht-hexadezimalzeichen
> -also z.B. 'X' - codiert, aber dennoch wäre es schön, das Problem zu lösen und nicht zu umgehen)?
>
> Vielen Dank!
>
>
Hallo,
Serial_ReadExt interpretiert gar nichts, der nimmt die Zeichen so wie sie kommen. Der Routine ist es
auch egal, ob das ASCII-Zeichen oder sonst etwas ist. Interpretiert werden die Zeichen nur von
Str_ReadNum(). Ich vermute deshalb, dass dein Problem woanders liegt: Wird dein String 'value'
ordenlich mit 0x0 abgeschlossen? Das geht aus deinem Codefragment nicht hervor. Wenn das nicht der
Fall ist, und durch die Reihenfolge deiner Definitionen die Variable 'color' direkt hinter value[1]
liegt, ist das empfangene 'B' für Str_ReadNum() noch ein Bestandteil der Hexzahl. Du musst value
auch mit mindestens Länge 3 definieren, damit du die 0x0 dann in value[2] unterbringst.

GruÃ?
Franz-Peter


    Antwort schreiben


Antworten:

Re: Probleme mit Serial_ReadExt(0) (von intron - 5.01.2011 10:35)
Re: Probleme mit Serial_ReadExt(0) (von Torsten - 4.01.2011 19:19)