Hallo, ich möchte gerne via vb.net einen String an einen ATMEGA8 senden und dieser soll das Gesendete gleich wieder zurück schicken. Das Problem ist das Stringende. Die Schleife erkennt das Ende des Strings nicht. Bei vb scheint das '\n' nicht mitgesendet zu werden. Hier mal mein C Code auf dem AVR: #include <avr/io.h> #include <string.h> #include <avr/interrupt.h> #define USART_PRESCALE (((F_CPU / (115200 * 16UL))-1)) int SendString(char *); char String1[50]; char* Empfangen; int main(void) { //Sende und Empfangsmodus einschalten UCSRB |= ( 1 << TXEN ) | ( 1 << RXEN ); //Modus: Asynchron 8N1 UCSRC |= ( 1 << URSEL ) | ( 1 << UCSZ0 ) | ( 1 << UCSZ1 ); //Baudrate setzen UBRRL = USART_PRESCALE; //USART Interrupts aktivieren UCSRB |= ( 1 << RXCIE); sei(); //Interrupts einschalten //Taster und LED DDRB &= ~( 1 << PB0 ); DDRB |= ( 1 << PB1 ); //PB1 auf Ausgang setzen PORTB |= ( 1 << PB0 ); for(;;) { if (!(PINB & (1 << PB0))) {SendString(String1);} } } int SendString (char *Symbol) { // so lange *Symbol != '\0' also ungleich dem "String-Endezeichen" while (*Symbol) { while (!(UCSRA & (1<<UDRE))) {} //Warten bis senden möglich UDR = *Symbol; //einzelnes Zeichen auf Schnittstelle schreiben Symbol++; } return 0; } ISR(USART_RXC_vect) //USART - Interrupt Routine: { PORTB |= ( 1 << PB1 ); // LED einschalten if (UDR != '\n') { *Empfangen++ = UDR; } SendString(Empfangen);//Empfangenes Zeichen direkt zurücksenden PORTB &= ~( 1 << PB1 ); // LED wieder ausschalten } Und hier mein vb Code (Auszug): Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click Try RS232.Write(txtSend.Text& vbnewline) Catch ex As TimeoutException MsgBox(ex.ToString, MsgBoxStyle.Critical, "TimeOut") Catch ex As Exception MsgBox(ex.ToString, MsgBoxStyle.Critical, "ERROR!") End Try End Sub Hat Jemand eine Idee ? Hab schon versucht es über /r oder /n mit dem vb-Linefeed, sprich 'vbnewline' umzusetzen, aber ohne Erfolg.
Schreib Dein AVR-Programm so um, daß es die Hex-Werte der empfangenen Bytes zurücksendet. Dann nimmst Du das PC-Hyperterminal und schaust, ob Du bei <RETURN> 0D 0A zurückbekommst. Wenn dann Dein uC-Programm so funktioniert, machst Du mit VB.Net den gleichen Test. Du wirst das Problem finden ;-)
Das mit dem Stringende bekomme ich nun hin, ich erweitere den String einfach um ein Chr(0), dann funktioniert es. Ich habe aber mal eine Verständnisfrage zum USART-Interrupt: Nehmen wir mal an ich sende einen String aus 3 Zeichen an den AVR. Dieser löst dann einen Interrupt aus und ich verarbeite das Erste Zeichen. Wird dann für jedes weitere Zeichen des Strings ein separater Interrupt ausgelöst, oder nur einmalig für den ganzen String ?
Scholly ... schrieb: > Nehmen wir mal an ich sende einen String aus 3 Zeichen an den AVR. > Dieser löst dann einen Interrupt aus und ich verarbeite das Erste > Zeichen. > Wird dann für jedes weitere Zeichen des Strings ein separater Interrupt > ausgelöst, oder nur einmalig für den ganzen String ? Der AVR kennt keine 'Strings'. Für den purzeln lediglich Bytes herein, was drinnesteht, interessiert ihn nicht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.