Доброго времени, суток)
Такая проблема:
Пишу программу на WINAVR, смысл таков - по прерыванию UART по линии Rx, программа должна возвращать символ, в зависимости от символа введенного в терминале.
НО, все попытки - сравнение строк, условия if и т.д. были тщетными... компилятор выдавал ворнинги...
В общем вопрос:
Как организовать отправку строки символов, в зависимости от строки введенной в теминале ?
Либо как корректно передать в main() содержание
UDR из
SIGNAL (SIG_UART_RECV)Вот так я писал функцию обработки прерывания изначально, но ничего не получалось:
SIGNAL (SIG_UART_RECV)
uint8_t usart_data;
uint8_t *pInpunStr = "start";
char *pDispatch;
int flag;
usart_data= UDR;
flag = strcmp(pInpunStr,usart_data);
if(flag = 1)
pDispatch = "GOOD";
else{
pDispatch = "TRY AGAIN";
}
usart_send_c(pDispatch);
}
CODE
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <util/delay.h>
#define F_OSC 16000000 /* oscillator-frequency in Hz (F_OSC) - caiaieou!!! */
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)
void delay_ms(unsigned short ms) {
unsigned short outer1, outer2;
outer1 = 200;
while (outer1) {
outer2 = 1000;
while (outer2) {
while ( ms ) ms--;
outer2--;
}
outer1--;
}
}
int strcmp(unsigned char *t1,unsigned char *t2)
{
while(*t1)
if(*t1-*t2)
return 0;
else{
t1++;
t2++;
}
return 1;
}
void usart_send_c(uint8_t c) {
// wait until UDR ready
while(!(UCSRA & (1 << UDRE)));
UDR = c; // send character
}
void uart_send_s(uint8_t *s) {
// loop until *s != NULL
while (*s) {
usart_send_c(*s);
s++;
}
}
/*Eieoeaeecaoey UART*/
void init(void) {
// set baud rate
UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);
// Enable receiver and transmitter; enable RX interrupt
UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
//asynchronous 8N1
UCSRC = (1 << URSEL) | (3 << UCSZ0);
}
SIGNAL (SIG_UART_RECV) { // USART RX interrupt
uint8_t usart_data;
usart_data= UDR;
usart_send_c(usart_data);
}
int main(void) {
init(); // init USART
while(!(UCSRA & (1 << UDRE)));
UDR = 0x0d;
char *p = "READY!";
while (*p){
while(!(UCSRA & (1 << UDRE)));
UDR = (uint16_t)*p;
p++;
}
#define LED1 7
#define LED_PORT PORTD
#define LED_DDR DDRD
LED_DDR = 1<<LED1;
sei(); // enable interrupts
while(1)
{
LED_PORT=0<<LED1;
_delay_ms(1000);
LED_PORT=1<<LED1;
_delay_ms(1000);
}
return 0;
}
Сообщение отредактировал IgorKossak - Apr 7 2011, 10:57
Причина редактирования: [codebox]