Hallo amin,
erstmal arbeitest Du anscheinend noch mit einer alten RP6Lib Version. In der neuen ist der Empfang von Daten über die serielle Schnittstelle etwas anders gelöst. Die neue Version gibts hier: http://www.arexx.com/rp6
Poste auch mal Dein komplettes Programm. Wenn immer 49 rauskommt, ist irgendwo anders was nicht richtig....
Ich hab das hier gerade selbst getestet (allerdings mit den neuesten Versionen) und eigentlich keine Probleme gehabt.
------------------------------
Die Auswertung von normalen Text Eingaben ist auch nicht so schwierig - hier ein paar Auszüge aus einem Beispielprogramm (neue Versionen von der RP6 Homepage!):
Code:
char receiveBuffer[charsToReceive+1]; // <<-- da kommt der Text rein
clearReceptionBuffer(); // Empfangspuffer leeren
uint8_t buffer_pos = 0;
while(true)
{
if(getBufferLength()) // Sind neue Zeichen da?
{
receiveBuffer[buffer_pos] = readChar(); // Ein Zeichen lesen
if(receiveBuffer[buffer_pos]=='\n' || buffer_pos >= charsToReceive) // Ende?
{
receiveBuffer[buffer_pos]='\0';
buffer_pos = 0;
break; // Schleife beenden! // ***1 s. unten
}
buffer_pos++;
}
}
Dieser Code empfängt eine komplette Eingabezeile (also bis zum Zeilenumbruch) bzw. bricht bei der maximalen Länge ab.
Danach kann man optional noch überprüfen ob es sich auch um einen Zahlenwert handelt:
Code:
uint8_t cnt;
uint8_t is_a_number = 1;
for(cnt = 0;cnt < 3 && receiveBuffer[cnt] != '\0'; cnt++)
{
if(!(receiveBuffer[cnt] >= '0' && receiveBuffer[cnt] <= '9'))
{
is_a_number = 0;
break;
}
}
Kann man aber komplett weglassen wenn man sicher ist, dass immer eine Zahl eingegeben wird.
Wenn es eine Zahl ist, dann kann per "atoi" (array-to-integer) Funktion aus der AVR Libc der Zahlenwert in eine Variable geschrieben werden.
Code:
if(is_a_number)
{
uint16_t value = atoi(receiveBuffer);
// ... mach was damit ...
}
else
// Keine Zahl...
So kann man wie z.B. beim Testprogramm einfach die Zahl eingeben ohne .n davor...
MfG,
SlyD
PS:
Bei
// ***1
könnte man auch den empfangenen Text verarbeiten und die Schleife nicht verlassen (Dann muss man hier nochmal clearReceptionBuffer usw. aufrufen)
So könnte man innerhalb der while(true) Schleife noch andere Sachen nebenbei machen - z.B. die Motoren regeln etc..
Lesezeichen