Hallo,
ich möchte über die Serielle Schnittstelle bestimmte Sachen steuern.
Dazu schicken ich Zeichen über Putty an den AVR.
Die gesendeten Zeichen sind von 0 bis 4097.
Jeweils 255 Werte gehören zu einem Befehl.
1
voidread_commands(void)
2
{
3
if(uart_str_complete)
4
{
5
uart_str_complete=0;
6
7
int16_tincoming=atoi(uart_string);
8
uint8_tcommand=incoming/255;
9
uint8_tvalue=incoming%255;
10
uart_puti(incoming);
11
uart_puts(uart_string);
12
13
uart_puts_P("\r\nBefehl : ");
14
uart_puti_formatted(command);
15
16
uart_puts_P("\tWert : ");
17
uart_puti_formatted(value);
18
19
uart_puts_P("\r\n");
20
}
21
}
1
ISR(USART0_RX_vect)
2
{
3
unsignedcharnextChar;
4
// Daten aus dem Puffer lesen
5
nextChar=UDR0;
6
7
// wenn uart_string gerade in Verwendung ist, neues Zeichen verwerfen
8
if(uart_str_complete==0){
9
10
// Daten werden erst in uart_string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
Mein Output sieht auf der Konsole aber nicht komplett richtig aus, ich
habe der Reihe nach folgende Werte eingegeben und mit Enter bestätigt.
15, 255, 256,
Bernd schrieb:> Die gesendeten Zeichen sind von 0 bis 4097.
Mit 8 Bit?
Da wirst du nachsynchronisieren müssen, denn wenn ein Byte verloren
geht, oder am Empfänger durch einen Störimpuls dazukommt, stimmt der
ganze Rest nicht mehr.
lrep schrieb:> Mit 8 Bit?>> Da wirst du nachsynchronisieren müssen, denn wenn ein Byte verloren> geht, oder am Empfänger durch einen Störimpuls dazukommt, stimmt der> ganze Rest nicht mehr.
er überträgt strings mit Zeilenumbruch. Das sollte schon passen.
Richtig, die Eingabe erfolgt als Zeichenkette und da sollte es noch
keine Probleme geben. Es werden auf der UART Schnittstelle max. 6
Zeichen eingelesen.
Bernd schrieb:> Die gesendeten Zeichen sind von 0 bis 4097.Peter II schrieb:> er überträgt strings mit Zeilenumbruch. Das sollte schon passen.
Dann muß er aber darauf achten, daß die Zeichenzahl gerade ist.
Falls ungerade, dann den ganzen String verwerfen, denn man weiß ja
nicht, wo der Fehler passierte.
...oder die ungenutzen Bits zur Übertragung einer Sequenznummerr
verwenden.
Fraglich auch, ob wirklich 0..4097 übertragen werden soll
lrep schrieb:> Dann muß er aber darauf achten, daß die Zeichenzahl gerade ist.> Falls ungerade, dann den ganzen String verwerfen, denn man weiß ja> nicht, wo der Fehler passierte.> ...oder die ungenutzen Bits zur Übertragung einer Sequenznummerr> verwenden.
versteht ich nicht? Er überträgt genau eine Zahl die dann in 2 Byte
umgerechnet wird.
Peter II schrieb:> kannst du etwas mehr code zeigen? Es fehlt noch einiges.> (initalisierung> der Variablen usw.)
Hallo Peter,
ich hoffe du meinst das hier.
// aus der uart.h
1
#define UART_MAXSTRLEN 6
2
#define BAUD 19200
3
4
externvolatileuint8_tuart_str_complete;
5
externvolatilecharuart_string[UART_MAXSTRLEN+1];
6
externvolatilecharc;
Ansonsten wüsste ich nicht, war hier noch interessant ist.
Bernd schrieb:> uart_str_complete = 0;
das solltest du erst machen wenn der String ausgewertet ist sonst machen
einkommende Zeichen evtl. deinen String kaputt,
Peter II schrieb:> Er überträgt genau eine Zahl die dann in 2 Byte> umgerechnet wird.
Na ja, ich bin kein C-Programmierer, aber ich sehe da einen Wertebereich
0..4097, der vermutlich in Wirklichkeit nur 0..4095 umfasst, und ich
sehe da die Division durch seltsame 255, was vermutlich 256 sein soll.
Bei der Verwendung von LF oder CRLF terminierten Strings, sehe ich die
Möglichkeit, dass die Falle schon zuschnappt, und der Strings verhunzt
wird, wenn an irgend einer Stelle des Strings eine dezimale 10 oder 13
über die Leitung rauscht.
lrep schrieb:> wenn an irgend einer Stelle des Strings eine dezimale 10 oder 13> über die Leitung rauscht.
Dies kann aber nicht geschehen, da Zahlen von 0 - 4097 Übertragen werden
sollen.
Daraus ergibt sich eine Nutzzeichenlänge von 1 - 4 Byte im Wertebereich
von 0x30 - 0x39.