PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serieller Datenempfang C# / AVR-GCC



shedepe
21.12.2010, 18:23
Hallo,
mir gehen langsam die Ideen aus warum bei meiner seriellen Datenübertragung mit 2 Xbee Modulen, jeweils 1 Byte falsch auf der PC Seite ankommt, wenn ich vom Roboter Daten versende.

Mein Code auf Roboterseite ist:


void SendDataPackage(uint8_t Identifier, uint16_t value)
{
USART1_Transmit(_StartCond); //Das hier kommt richtig an

USART1_Transmit(Identifier); //Das hier kommt richtig an
//value zerlegen
uint8_t highB = (uint8_t)(value >> 8);

uint8_t lowB = (uint8_t)value;

USART1_Transmit(lowB); //Das hier kommt FALSCH an

USART1_Transmit(highB); //Das hier kommt richtig an

USART1_Transmit(_EndCond); //Das hier kommt richtig an

}




Auf PC Seite:



void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Debug.WriteLine("Recieved Event ausgeführt");

foreach (byte item in serialPort.ReadExisting())
{
Debug.WriteLine(item); //Hier werden alle empfangenen Bytes ausgegeben
}
//Mache was mit den Daten
}



Wie im oberen Code bereits kommentiert kommt das Identifier - Byte, das _StartCond - Byte, das _EndCond - Byte und das hByte richtig an.
Beim lByte jedoch wird immer 63 empfangen.

Meine Serialport Einstellungen sind:
8 Datenbits
1 Stopbit
NoParity
Baudrate : 115200
Verwunderlich ist das ganze für mich zudem, da Daten vom PC zum Roboter richtig übertragen werden.

shedepe
22.12.2010, 18:09
Ich weiß ja, dass das Pushen eines Threads sich nicht gehört. Ich machs jetzt aber trotzdem.

Hat wirklich niemand eine Idee woran das liegen könnte ?

TobiKa
22.12.2010, 19:56
Hast es mal mit HTerm probiert?

Slein
22.12.2010, 20:06
Mahlzeit!

3 Schüsse ins Blaue:

1. Timing Problem?

void SendDataPackage(uint8_t Identifier, uint16_t value) {
// --- value zerlegen
uint8_t highB = (uint8_t)(value >> 8);
uint8_t lowB = (uint8_t)value;

// --- senden
USART1_Transmit(_StartCond); //Das hier kommt richtig an
USART1_Transmit(Identifier); //Das hier kommt richtig an
USART1_Transmit(lowB); //Das hier kommt FALSCH an
USART1_Transmit(highB); //Das hier kommt richtig an
USART1_Transmit(_EndCond); //Das hier kommt richtig an
}

2. Konvertierungsproblem?

void SendDataPackage(uint8_t Identifier, uint16_t value) {
// --- value zerlegen
uint8_t lowB = (uint8_t) (value & 0xff);
uint8_t highB = (uint8_t) (value >> 8);

// --- senden
USART1_Transmit(_StartCond); //Das hier kommt richtig an
USART1_Transmit(Identifier); //Das hier kommt richtig an
USART1_Transmit(lowB); //Das hier kommt FALSCH an
USART1_Transmit(highB); //Das hier kommt richtig an
USART1_Transmit(_EndCond); //Das hier kommt richtig an
}

3. Übertragung mit enm bekannten Testbyte (Timing die 2.)?

void SendDataPackage(uint8_t Identifier, uint16_t value) {
// --- value zerlegen
uint8_t lowB = (uint8_t) (value & 0xff);
uint8_t highB = (uint8_t) (value >> 8);

// --- senden
USART1_Transmit(_StartCond); //Das hier kommt richtig an
USART1_Transmit(Identifier); //Das hier kommt richtig an
USART1_Transmit(0xaa); //Das hier kommt FALSCH an
USART1_Transmit(highB); //Das hier kommt richtig an
USART1_Transmit(_EndCond); //Das hier kommt richtig an
}

Ich bau mir fürs Senden per UART immer einen Puffer:

uint8_t txbuffer[5];

void SendDataPackage(uint8_t Identifier, uint16_t value) {
// --- value zerlegen
txbuffer[2] = (uint8_t) (value & 0xff);
txbuffer[3] = (uint8_t) (value >> 8);

// --- frame bauen
txbuffer[0] = _StartCond;
txbuffer[1] = Identifier;
txbuffer[4] = _EndCond;

// --- senden
send_txbuffer(5);
}

void send_txbuffer(uint8_t len) {
for (uint8_t i=0;i<len;i++) {
USART1_Transmit(txbuffer[i]);
}
}

Da die USART einen Int wirft wenn der TX Puffer der USART leer ist, kann man dann den Puffer schön in einer int routine rausschreiben und derweil was anderes sinnvolles tun :) Und im PC kommt alles schön auf einmal an, da die Bytes am Stück geschrieben werden.

Viel Glück :)

shedepe
23.12.2010, 20:44
Vielen Dank für die vielen Tipps. Leider werd ich erst die nächsten Tage zum ausprobieren kommen, da ich erst meinen Entwicklungs-PC wieder zusammen schrauben muss, so dass er läuft ^^