Já jsem našel takovýhle program, ale tomu nerozumím, tak jestli to jde nějak zjednodušit.Tupě dělat něco, když nevíš co, je k ničemu.Každopádně přeložim, nahraju funguje to, ale překladač mi vyhlásí uporornění a to taky nevím proč a jestli si toho všímat:
led_rozsvec.c:143: warning: passing argument 1 of ‘strncmp’ discards qualifiers from pointer target type
led_rozsvec.c:146: warning: passing argument 1 of ‘strncmp’ discards qualifiers from pointer target type
led_rozsvec.c:150: warning: passing argument 1 of ‘strncmp’ discards qualifiers from pointer target type
led_rozsvec.c:154: warning: passing argument 1 of ‘strncmp’ discards qualifiers from pointer target type
led_rozsvec.c: In function ‘__vector_11’:
led_rozsvec.c:172: warning: array subscript has type ‘char’
led_rozsvec.c:177: warning: array subscript has type ‘char’
led_rozsvec.c:178: warning: passing argument 1 of ‘strncpy’ discards qualifiers from pointer target type
led_rozsvec.c:178: warning: passing argument 2 of ‘strncpy’ discards qualifiers from pointer target type
#include <avr/io.h>
#define F_CPU 8000000
#include <stdio.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <string.h> // funkce pro praci s řetězci strncmp(), strncpy()
#define DELKA_ZPRAVY 16 // maximalni delka zpravy
int usart_putchar(char var, FILE *stream); // odesila znaky na UART
static FILE mystdout = FDEV_SETUP_STREAM(usart_putchar, NULL, _FDEV_SETUP_WRITE);
volatile char nova_zprava=0; // indikuje prichod nove zpravy
volatile char zprava[DELKA_ZPRAVY]; // tady bude uložena celá přijatá zpráva
volatile char docasne[DELKA_ZPRAVY]; // sem se postupně ukládají přicházející znaky
int main(void){
stdout = &mystdout; // nastavení printf na UART
DDRA = (1<<DDA1) | (1<<DDA2); // indikační LED
UBRRL = 0x33; // baud rate 9600 s clockem 8MHz
UCSRB = (1<<RXEN)|(1<<TXEN); // zapnout vysílač i přijímač
UCSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1); // 8bit přenos, URSEL vybira zapis do UCSRC
UCSRB |= (1 << RXCIE); // povolit přerušení od přijímače
sei(); // globální povolení přerušení
while(1){
if(nova_zprava){ // pokud přišla nová zpráva
// porovnáme obsah zpráv
if(strncmp(zprava,“ahoj”,DELKA_ZPRAVY)==0){
printf_P(PSTR(“Nazdar.\n\r”)); // pošli odpověď
}
else if(strncmp(zprava,“rozsvit”,DELKA_ZPRAVY)==0){
PORTA |= (1<<PORTA1);
printf_P(PSTR(“S radosti.\n\r”)); // pošli odpověď
}
else if(strncmp(zprava,“rozsvit vic”,DELKA_ZPRAVY)==0){
PORTA |= (1<<PORTA1) | (1<<PORTA2);
printf_P(PSTR(“Jak je libo.\n\r”)); // pošli odpověď
}
else if(strncmp(zprava,“zhasni”,DELKA_ZPRAVY)==0){
PORTA &=~((1<<PORTA1) | (1<<PORTA2));
printf_P(PSTR(“Zhasnuto.\n\r”)); // pošli odpověď
}
else{
printf_P(PSTR(“Nerozumim.\n\r”)); // žádná známá zpráva
}
nova_zprava=0; // zpráva je zpracována, budeme čekat na novou
}
}
}
ISR(USART_RXC_vect){
char prijaty_znak;
static char i=0; // pocitadlo znaku v prijimane zprave
prijaty_znak = UDR; // vytáhneme znak co nejdřív z přijímacího bufferu
// pokud nepřišel ukončovací znak a ještě není znaků moc
if((prijaty_znak != ‘\n’) && (prijaty_znak!=‘\r’) && (i<DELKA_ZPRAVY-2)){
docasne[i]=prijaty_znak; // uložíme nově příchozí znak
i++;
}
else{
// pokud je konec zprávy
docasne[i]=‘\0’; // uložíme na konec znak ‘\0’ - konec řetězce
strncpy(zprava,docasne,DELKA_ZPRAVY); // zkopirujeme přijatý text do pole zprava
nova_zprava=1; // dáme vědět hlavní smyčce že má novou zprávu
i=0; // připravíme se na příjem nové zprávy
}
}
int usart_putchar(char var, FILE *stream) {
while (!(UCSRA & (1<<UDRE))); // čekej než se dokončí případná předchozí vysílání
UDR = var; // odešli data
return 0;
}