sodjan skrev:Det skulle kanske vara effektivare (mindre kod och bättre prestanda)
genom att använda någon av de strängfunktioner som brukar finnas i C.
(Ja, jag vet att det rent formellt inte ligger i C i sig, utan i biblioteken...)
Sen är det ju frågan *när* koden ovan körs? Vad är det som triggar det?
Skickas det enbart "Post" eller skickas det även CR och/eller LF?
Det syns inte i den visade koden, men någonstans måste du ju även sätta
pekaren till bufferten till början igen för att ta emot nästa packet.
Det vanliga är nog att man fyller på en buffert (skulle kunna vara uart_rd)
och när en speciell avslutare ("terminator") kommer in, så analyserar man
vad som finns i bufferten. Eventuellt kopierar man först bufferten snabbt till
en ny area så att huvudbufferten direkt är tillgänglig för att ta emot nästa
packet under tiden som man analyserar och agerar på föregående paket.
Som uart överföring använder jag tx/rx 433MHz modulerna från Swech och det är alltså pinnen som är rx kopplad till PICen som jag verifierat rena datasignaler!
Kod nedan.
Kod: Markera allt
char uart_rd[20];
int i;
// Defining IO name
#define LOADSWITCH PORTA.F3
#define BUZZER PORTA.F4
#define SETRST PORTB.F3
#define BACKLIGHT PORTA.F2
//LCD module connection
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RA6_bit;
sbit LCD_D5 at RA7_bit;
sbit LCD_D6 at RA0_bit;
sbit LCD_D7 at RA1_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISA6_bit;
sbit LCD_D5_Direction at TRISA7_bit;
sbit LCD_D6_Direction at TRISA0_bit;
sbit LCD_D7_Direction at TRISA1_bit;
//End LCD module connection
void Init_Main(){
APFCON0=0b00000000;
OSCCON=0b01101000; //4Mhz
C1ON_bit=0;
SRLEN_bit=0;
TRISA=0b00000000;
TRISB=0b00001010;
ANSELA=0b00000000;
ANSELB=0b00000000;
ADCON0=0b00000000;
ADCON1=0b00000000;
UART1_Init(9600);
LOADSWITCH=0;
BUZZER=1;
BACKLIGHT=1;
LCD_Init();
LCD_Cmd(_LCD_CURSOR_OFF);
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"HusDiag R1.0");
Lcd_out(2,1,"Karoly.S 2017");
BUZZER=0;
for(i=0; i<20; i++){
delay_ms(100);
}
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Sensorer OK");
Lcd_out(2,1,"inget larm");
BACKLIGHT=0;
}
void LightUp(){
BACKLIGHT=1;
BUZZER=1;
delay_ms(100);
BUZZER=0;
delay_ms(2000);
BACKLIGHT=0;
}
void Recieve(){
if(UART1_Data_Ready()==1){
UART1_Read_Text(uart_rd,"\n",255);
if(uart_rd[0]=='D'){
if(uart_rd[1]=='r')
if(uart_rd[2]=='a')
if(uart_rd[3]=='n')
if(uart_rd[4]=='a')
if(uart_rd[5]=='g')
if(uart_rd[6]=='e'){
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Dränering full");
Lcd_out(2,1,"pumpa ut vatten!");
LOADSWITCH=1;
}
}
else if(uart_rd[0]=='P'){
if(uart_rd[1]=='o')
if(uart_rd[2]=='s')
if(uart_rd[3]=='t'){
delay_ms(100);
BACKLIGHT=1;
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Du har ny post!");
LOADSWITCH=1;
BUZZER=1;
delay_ms(200);
BUZZER=0;
delay_ms(200);
BUZZER=1;
delay_ms(200);
BUZZER=0;
delay_ms(200);
while(SETRST==0){
BACKLIGHT=1;
}
}
}
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Sensorer OK");
Lcd_out(2,1,"inget larm");
BACKLIGHT=0;
LOADSWITCH=0;
}
}
void main() {
Init_Main();
while (1){
if(SETRST==1)
LightUp();
Recieve();
}
}
det som också gör mig lite mörkrädd är varifrån kommer alla hittepå tecken jag får ut i displayen. Display texten är ju satt på ett par rader och är alltså inte "dynamisk".