با سلام خدمته تمامی اساتید. بنده با یک مشکل مواجه شدم و اینه که من با atmega 32 یک ارتباطه usb راه انداختم که موفق به راه اندازی uasbasp شدم با این میکرو ولی در کنارش میخوام از uart اطلاعات بگیرمو به usb ارسال کنم و من uart رو با scanf و printf پیکر بندی کردم وبا ارساله اطلاعات هیچ مشکلی ندارم ولی در هنگامی که میخواهم اطلاعات را دریافت کنم با استفاده از scanf تا زمانی که به rx داده نرسه در این تابع میمونه و چون من هر یک ثانیه اطلاعاتم میاد usb من remove میشه چون usbpll باید هر 50 میلی ثانیه فراخوانی بشه ولی من تا یک ثانیه در scanf میمونم لطفا یه راهی پیشنهاد بدبد منو نجات بدید
#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "MSProtocol.h"
#include "usbdrv/usbdrv.h"
#include "usbdrv/oddebug.h"
#include "usbdrv/uart.h"
static void avr_init(void);
char * b;
uchar usbFunctionSetup(uchar data[8])
{
return USB_NO_MSG;
}
int i;
uchar usbFunctionWrite(uchar *data, uchar len)
{
for (i=0;i<=5;i++)
data[i]=b[i];
b=0;
return 6;
}
uchar usbFunctionRead(uchar *data, uchar len)
{
for (i=0;i<=5;i++)
data[i]=b[i];
b=0;
return 6;
}
int main(void)
{
avr_init();
for(;;)
{
wdt_reset();
usbPoll();
// PORTB |=_BV(0);
//printf("hamed%c",95);
}
return(0);
}
static void avr_init(void)
{
wdt_enable(WDTO_2S);
usbDeviceDisconnect();
int j=0;
uart_init();
sei();
DDRB |=_BV(0);
MSProtcollInit(PORTB);
_delay_ms(300);
usbDeviceConnect();
usbInit();
odDebugInit();
return;
}
و این هم کد صفحه ی MSProtocol.h
#include "MSProtocol.h"
char MSProtcollInit( int P)
{
char * uart_s_data;
FILE uart_str = FDEV_SETUP_STREAM(uart_putch, uart_getch, _FDEV_SETUP_RW);
stdout = stdin = &uart_str;
PORTB|=_BV(0);
printf("%s","hamed");
printf("%s","hamed");
printf("%s","hamed");
PORTB &=~_BV(0);
_delay_ms(30);
scanf("%s",&uart_s_data);
return -1;
}
void uart_init(void)
{
UBRRH = (((F_CPU/BAUD_RATE)/16)-1)>>8; // set baud rate
UBRRL = (((F_CPU/BAUD_RATE)/16)-1);
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
int uart_putch(char ch, FILE *stream)
{
if (ch == '\n')
uart_putch('\r', stream);
while (!(UCSRA & (1<<UDRE)));
UDR=ch;
return 0;
}
int uart_getch(FILE *stream)
{
unsigned char ch;
while (!(UCSRA & (1<<RXC)));
ch=UDR;
uart_putch(ch,stream);
return ch;
}
char getbyte ()
{
unsigned char ch;
while (!(UCSRA & (1<<RXC)));
ch=UDR;
return ch;
}