BomberD
10.11.2004, 13:30
Hi,
ich versuche mehrere Zeichen(Strings unterschiedlicher Länge) per rs232 vom PC auf den AtMega und zurück zu übertragen.
Leider hab ich keine Ahnung woran ich erkenne wann das letzte Zeichen übertragen wurde. Deshalb hab ich einfach gesagt die '#' solls sein.
Leider läuft das so nicht.
Anbei der Quellcode. Neben dem Interrupt gesteuerte Zeicehempfang läuft noch ein Timer mit dem ich ne Led Blinken lasse.
Ich bin für jeden Tipp dankbar der Licht in mein Dunkel bringt. :/
#include <avr/io.h>
#include "SeriellBiblio.h"
#include <progmem.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/string.h>
//Arbeitstakt angeben
#define SYSCLK 8000000UL
//usart ansprechen
volatile unsigned char *data;
volatile int count=0;
volatile unsigned char b;
void timer (void){
TIMSK=_BV(TOIE0); //overflow flag setzen--> ab jetzt kan overflow interrupt ausgelöst werden
TCNT0 = 0; //Rücksetzen des Timers
TCCR0 = _BV(CS02); //Prescaler 256
sei (); //interrupts ein
}
int main(void) {
USART_Init ();
timer ();
//sei();
//unsigned char data = 0;
DDRB = 0xff;
PORTB=0xff;
for (;;) {
//data = USART_receive ();
//darf erst vergleichen wenn nicth mehr gesendet wird... hmmm
if(b=='1'){
if (strstr((char*)data, "1#")){
PORTB = 0x00;
data="";
}
else if (strstr((char*)data, "0#")){
PORTB = 0xff;
data="";
}
else if (strstr((char*)data, "Steffen#")){
USART_transmit_string("Hallo Steffen");//(char*)data
data="";
}
else if (strstr((char*)data, "Jana#")){
USART_transmit_string("Hallo Jana");//(char*)data
data="";
}
b='0';
}
}
return 0;
}
//intterrupt wenn byte empfangen
SIGNAL (SIG_UART_RECV){
data+=UDR;//hänge neues byte an
if (UDR=='#')b='1'; //prüft ob Receive complete
}
//lässt led blinken
SIGNAL (SIG_OVERFLOW0) {
count++;
if (count==4){
if(PORTB & (1<<PB0)){
PORTB&=~(1<<PB0);
count=0;
}
else{
PORTB|=(1<<PB0);
count=0;
}
}
}
ich versuche mehrere Zeichen(Strings unterschiedlicher Länge) per rs232 vom PC auf den AtMega und zurück zu übertragen.
Leider hab ich keine Ahnung woran ich erkenne wann das letzte Zeichen übertragen wurde. Deshalb hab ich einfach gesagt die '#' solls sein.
Leider läuft das so nicht.
Anbei der Quellcode. Neben dem Interrupt gesteuerte Zeicehempfang läuft noch ein Timer mit dem ich ne Led Blinken lasse.
Ich bin für jeden Tipp dankbar der Licht in mein Dunkel bringt. :/
#include <avr/io.h>
#include "SeriellBiblio.h"
#include <progmem.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/string.h>
//Arbeitstakt angeben
#define SYSCLK 8000000UL
//usart ansprechen
volatile unsigned char *data;
volatile int count=0;
volatile unsigned char b;
void timer (void){
TIMSK=_BV(TOIE0); //overflow flag setzen--> ab jetzt kan overflow interrupt ausgelöst werden
TCNT0 = 0; //Rücksetzen des Timers
TCCR0 = _BV(CS02); //Prescaler 256
sei (); //interrupts ein
}
int main(void) {
USART_Init ();
timer ();
//sei();
//unsigned char data = 0;
DDRB = 0xff;
PORTB=0xff;
for (;;) {
//data = USART_receive ();
//darf erst vergleichen wenn nicth mehr gesendet wird... hmmm
if(b=='1'){
if (strstr((char*)data, "1#")){
PORTB = 0x00;
data="";
}
else if (strstr((char*)data, "0#")){
PORTB = 0xff;
data="";
}
else if (strstr((char*)data, "Steffen#")){
USART_transmit_string("Hallo Steffen");//(char*)data
data="";
}
else if (strstr((char*)data, "Jana#")){
USART_transmit_string("Hallo Jana");//(char*)data
data="";
}
b='0';
}
}
return 0;
}
//intterrupt wenn byte empfangen
SIGNAL (SIG_UART_RECV){
data+=UDR;//hänge neues byte an
if (UDR=='#')b='1'; //prüft ob Receive complete
}
//lässt led blinken
SIGNAL (SIG_OVERFLOW0) {
count++;
if (count==4){
if(PORTB & (1<<PB0)){
PORTB&=~(1<<PB0);
count=0;
}
else{
PORTB|=(1<<PB0);
count=0;
}
}
}