سلام دوستان خسته نباشید
من برنامه رو تو Atmel Studio نوشتم و چون تو Atmel Studio نتوستم از کتابخونه stdio.h برای ارتباط با پورت سریال استفاده کنم مجبور شدم از ریجستر های USART استفاده کنم
ولی در صورتی که پورت USART رو به کامپیوتر وصل کنم همه اطلاعات رو به درستی دریافت میکنم ولی در ارتباط با SIM800 فقط دو کارکتر اول دریافت میشه
ایا راهی است از دستورات Sprintf و scanf تو Atmel Studio استفاده کنم؟
در ضمن SIM800 با کامپیوتر به درستی کار میکنه
ممنونم
من برنامه رو تو Atmel Studio نوشتم و چون تو Atmel Studio نتوستم از کتابخونه stdio.h برای ارتباط با پورت سریال استفاده کنم مجبور شدم از ریجستر های USART استفاده کنم
ولی در صورتی که پورت USART رو به کامپیوتر وصل کنم همه اطلاعات رو به درستی دریافت میکنم ولی در ارتباط با SIM800 فقط دو کارکتر اول دریافت میشه
ایا راهی است از دستورات Sprintf و scanf تو Atmel Studio استفاده کنم؟
در ضمن SIM800 با کامپیوتر به درستی کار میکنه
ممنونم
[FONT=Yekan]
#ifdef F_CPU[/FONT]
#define F_CPU 8000000UL
#endif
#define baud_rate 9600
#define baud ((F_CPU/(16UL * baud_rate))-1)
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
#include <avr/interrupt.h>
#include <string.h>
volatile int ifg = 0, h = 0, i = 0, j = 0;
volatile unsigned char msgc[20] , msg[100];
volatile unsigned int g = 0;
#define Ent 10
void USART_Init(void){
UCSRA = 0x00;
UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
UBRRL = baud;
UBRRH = (baud<<8);
UCSRB|=(1<<RXCIE);
}
void USART_Transmit_Char(unsigned char data){
while(!((UCSRA) & (1<<UDRE)));
UDR = data;
}
void USART_Transmit_String(unsigned char *_string_){
int i;
for(i=0;i<strlen(_string_);i++){
while (( UCSRA & (1<<UDRE)) == 0){};
UDR = _string_[i];
}
}
unsigned char USART_Recieve_Char(void){
while (((UCSRA) & (1<<RXC))==0);
return UDR;
}
unsigned char USART_Recieve_String(unsigned char *_string){
unsigned char s = 0;
unsigned char n = 0;
UDR = 0;
while (1)
{
s = USART_Recieve_Char();
if (s == '\n')break;
_string[n] = s;
UDR = 0;
n++;
}
_string[n] = 0;
}
ISR(USART_RXC_vect){
UCSRB&=~(1<<RXCIE); // DISABLE INTERRUPT
ifg=1;
UDR =0;
USART_Recieve_String(msgc);
}
int main(void)
{
USART_Init();
_delay_ms(30);
lcd_init();
lcd_clear();
_delay_ms(100);
lcd_gotoxy(1,0);
_delay_ms(1000);
lcd_clear();
sei();
cheak:
//sprintf(msg,"ATE0%c",ent);
//USART_Transmit_String(msg);
lcd_gotoxy(0,0);
lcd_clear();
lcd_puts("Connecting");
_delay_ms(1000);
/*if(strstr(msgc,"OK")==NULL){
lcd_puts(msgc);
_delay_ms(1000);
UCSRB|=(1<<RXCIE);
goto cheak;
}
else{
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("OK");
_delay_ms(1000);
UCSRB|=(1<<RXCIE);
//goto cheak;
}*/
lcd_clear();
while (1)
{
if (ifg == 1){
_delay_ms(1000);
lcd_gotoxy(0,0);
lcd_putsf(msgc);
if(strstr(msgc , "RING")){
lcd_gotoxy(1,1);
lcd_puts("OK");
lcd_clear();
}
ifg = 0;
UCSRB|=(1<<RXCIE);
}
}
[FONT=Yekan]}[/FONT]
دیدگاه