AVR串口通信问题,使用的芯片是mega88pa,求大神指点,为何我收不到数据?程序很常见如下:
//发送函数voidputchar0(unsignedcharc){while(!(UCSR0A&(1<<UDRE0)));//表明发送器已经准备就绪UDR0=c;//将...
//发送函数
void putchar0(unsigned char c)
{
while (!(UCSR0A&(1<<UDRE0)));//表明发送器已经准备就绪
UDR0=c; //将要发送的数据装入UDR0寄存器
}
//初始化函数
//函数功能:uart0初始化程序 入口参数: 出口参数: *******************/
void uart0_init(void)
{
UCSR0B = 0x00; //关闭UART00
UCSR0A = 0X00; //不使用倍速发送(异步)
UCSR0C = 0X06; //(1<<UCSZ01)|(1<<UCSZ00) //数据位为8位
UBRR0L = 0x51; //(fosc/16/baud-1)%256; //异步正常情况下的计算公式 U2XN=1则是8等于0则是16
UBRR0H = 0x00; //(fosc/16/baud-1))/256;
UCSR0B = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接收使能和发送使能 若中断使能则需要置位
}
//主函数不停发送0x71
void main()
{
while(1)
{
putchar0(0x71);
}
}
我感觉程序没问题,可惜就是收不到数据,如蒙赐教,不胜感激! 展开
void putchar0(unsigned char c)
{
while (!(UCSR0A&(1<<UDRE0)));//表明发送器已经准备就绪
UDR0=c; //将要发送的数据装入UDR0寄存器
}
//初始化函数
//函数功能:uart0初始化程序 入口参数: 出口参数: *******************/
void uart0_init(void)
{
UCSR0B = 0x00; //关闭UART00
UCSR0A = 0X00; //不使用倍速发送(异步)
UCSR0C = 0X06; //(1<<UCSZ01)|(1<<UCSZ00) //数据位为8位
UBRR0L = 0x51; //(fosc/16/baud-1)%256; //异步正常情况下的计算公式 U2XN=1则是8等于0则是16
UBRR0H = 0x00; //(fosc/16/baud-1))/256;
UCSR0B = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接收使能和发送使能 若中断使能则需要置位
}
//主函数不停发送0x71
void main()
{
while(1)
{
putchar0(0x71);
}
}
我感觉程序没问题,可惜就是收不到数据,如蒙赐教,不胜感激! 展开
展开全部
所有分析都是建立在你的硬件电路没设计错误,没焊接错误的情况下。
万用表先测量CPU电源电压是否正确。5V?
看你说的路子,你好像是要同一个CPU,发出去数据,然后再自己接收回来。若是这样,请保证CPU的RXD和TXD脚已经短路了。
你没说你烧写的程序,是否开启了看门狗。若开启了看门狗,你在程序中没有复位看门狗的语句,那你的程序其实就是在不停地复位,根本无法工作起来。
UBRR0L = 0x51;
UBRR0H = 0x00;
这两句请把顺序颠倒过来,先给UBRR0H赋值,再给UBRR0L赋值。具体请查阅PDF文档,大部分AVR中,需要这么特殊处理。
你的程序没给完整,无法判断你的接收程序正确与否。你是用中断接收还是查询接收?若是中断接收,全局中断开放否?接收程序是否将相关标志位复位以便下次再次接收数据了?会否已经正确接收到数据了,但你的判断方法有问题?
只能参考到此了,祝顺利!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询