AVR ATmega16 单片机串口通信问题?谢谢
问题是这样:利用串口助手实现电脑和单片机的通信,电脑向单片机发送数据(字符),可以实现单字节和多字节通信,现在的问题是,本来我单片机设置的波特率为19200,串口助手也是...
问题是这样:利用串口助手实现电脑和单片机的通信,电脑向单片机发送数据(字符),可以实现单字节和多字节通信,现在的问题是,本来我单片机设置的波特率为19200,串口助手也是19200,如果我串口助手改成其他波特率(比如2400,9600等),再给单片机发送数据,那单片机肯定是没有反应,问题是把波特率改回来19200之后,数据就发送不进去了,必须关掉串口助手再次打开才行,我程序中也没有写发送数据不对就不接受,或者说关闭中断什么的,问题是这和波特率有关,我波特率设置应该没问题,要不然也不会实现通信?请问为什么,怎样解决,谢谢
//***字符接受中断函数***//
void uart_RX(void)
{
UCSRB&=~BIT(RXCIE);//关闭接受结束中断
rdata[num]=UDR;
send_B(rdata[num]);
num++;
flag=1;
UCSRB|=BIT(RXCIE);//打开中断
}
//***发送一个字符***//
void send_B(uchar data)
{
while(!(UCSRA&(BIT(UDRE))));
UDR=data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);//清零//
} 展开
//***字符接受中断函数***//
void uart_RX(void)
{
UCSRB&=~BIT(RXCIE);//关闭接受结束中断
rdata[num]=UDR;
send_B(rdata[num]);
num++;
flag=1;
UCSRB|=BIT(RXCIE);//打开中断
}
//***发送一个字符***//
void send_B(uchar data)
{
while(!(UCSRA&(BIT(UDRE))));
UDR=data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);//清零//
} 展开
3个回答
展开全部
有没有试过在串口助手中关闭串口,然后重新打开串口试试?
你说的这种现象,很可能是串口助手本身的某个小bug造成的.
前提是,你之前在关闭和重新打开串口助手期间,没有对单片机进行复位啊之类的操作,才可以这样判断.
你说的这种现象,很可能是串口助手本身的某个小bug造成的.
前提是,你之前在关闭和重新打开串口助手期间,没有对单片机进行复位啊之类的操作,才可以这样判断.
追问
你好,我有接着试了试,不是串口助手的问题,用其他串口调试软件也一样,我上面说的问题不完全对,单片机也需要重新上电,现在调试程序发现,用错误的波特率发送数据后,单片机响应中断,然后就回不来了,中断是接受结束中断,里边的程序是按照通常的格式编写的,我贴出来看看,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果单片机一直处于正常接收状态,重新启动串口助手之后单片机能作出响应,说明是串口助手这方面的问题,或是软件的问题,或是操作系统的问题,与单片机无关。
追问
你好,我有接着试了试,不是串口助手的问题,用其他串口调试软件也一样,我上面说的问题不完全对,单片机也需要重新上电,现在调试程序发现,用错误的波特率发送数据后,单片机响应中断,然后就回不来了,中断是接受结束中断,里边的程序是按照通常的格式编写的,我贴出来看看,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发送频率太快了,加个延时
追问
老师你好,请问吧延时加在哪里?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询