Naja, das ist simple Stringverarbeitung... Das hat erstmal nichts mit dem RP6 zu tun sondern ist einfach Grundlagenwissen in C#.
Guck dir mal die Methoden an, die ein String bereitstellt...
Naja, das ist simple Stringverarbeitung... Das hat erstmal nichts mit dem RP6 zu tun sondern ist einfach Grundlagenwissen in C#.
Guck dir mal die Methoden an, die ein String bereitstellt...
@radbruch
Senden tuht er jetzt ununterbrochen (soll ja auch so sein!)
Aber er "hört" nicht auf mich... und die Servos gehen in die MAX stellung?!?
Code:void task_befehle(void) { char uart_receive_buffer[UART_RECEIVE_BUFFER_SIZE+1]; uint8_t uart_status; uint8_t read_pos = 0; uint8_t write_pos = 0; uint8_t read_size = 0; uint8_t write_size = 0; static uint8_t dummy; if(((uint8_t)(write_size - read_size)) < UART_RECEIVE_BUFFER_SIZE) { uart_receive_buffer[write_pos++] = UDR; write_size++; if(write_pos > UART_RECEIVE_BUFFER_SIZE) write_pos = 0; uart_status = UART_BUFFER_OK; } else { dummy = UDR; uart_status = UART_BUFFER_OVERFLOW; } long pos = atoi(uart_receive_buffer); if(pos < 180 && pos > 0) { servo1_position = pos; } else if(pos < 360 && pos > 180) { servo2_position = pos - 180; } else if(pos < 540 && pos > 360) { servo3_position = pos - 360; } else if(pos == -1) { I2CTWI_transmitByte(PCF, 0); } else if(pos == -2) { I2CTWI_transmitByte(PCF, 3); } }
Okay, was soll das denn mal werden? Das sieht mir irgendwie schwer kompliziert aus...
Aber du hast meinen Tipp imernoch nicht berücksichtigt. Du liest immer nur das erste Zeichen aus.
Dann stellst du sofort deinen Servo auf dieses erste Zeichen. Du musst erst warten, bis die komplette Zahl übertragen wurde.
Ja, finde ich auch!Das sieht mir irgendwie schwer kompliziert aus...
Das ist das Problem, wenn ich "while(!Eingabe());" schreibe blockiert das solange die while-schleife bis ich was vom Pc schicke!Du liest immer nur das erste Zeichen aus.
Dann stellst du sofort deinen Servo auf dieses erste Zeichen. Du musst erst warten, bis die komplette Zahl übertragen wurde.
Nur mal so als Anregung... Aus meinem eigenen Code...
Code:if(getBufferLength()) { char tmp = readChar(); if (tmp =='#') { mSleep(10); counter = 0; } text[counter] = tmp; text[counter + 1] = '\0'; counter++; } int cmd = getCommand(); if(cmd) { [..] }
Also muss man nurdahintermachen?Code:if(cmd) { [..] }
So klappt es nicht:
Code:void lesen(void) { char text[50]; int counter = 0; if(getBufferLength()) { char tmp = readChar(); if (tmp =='\n') { mSleep(10); counter = 0; } text[counter] = tmp; text[counter + 1] = '\0'; counter++; } long cmd = atoi(text); if(cmd) { if(cmd == -1) { I2CTWI_transmitByte(PCF, 0); } else if(cmd == -2) { I2CTWI_transmitByte(PCF, 3); } } }
Ganz allgemeiner Tipp (ohne den Code nachvollzogen zu haben):
Sinnvolle TEXTAUSGABEN zum debuggen in den Code reinmachen damit Du sehen kannst was wo wie passiert.
Auch die Werte ausgeben lassen mit writeInteger und writeString ...
MfG,
SlyD
Nein, du hast einen ganz wichtigen (eigentlich den WICHTIGSTEN) Teil des Codes gerade gelöscht :P
Du must nun eine Funktion getCommand() schreiben, die den übertragenen String in einen Befehl umwandelt![]()
Lesezeichen