Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > 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 > > Hallo Franz-Peter, > der Fehler lag tatsächlich im fehlenden value[2]=0x0. Vielen Dank für den Hinweis. Jetzt > funktioniert es. > Viele Grüße