ATMAGE16L的串口通讯的奇怪问题。

happy0755 2010-07-08 08:33:03
我用信真器+开发板+串口调试助手调试ATMAGE16L的串口通讯功能:


#include <iom16v.h>
//#include<intrinsics.h>
#define UDRE 5
#define RXC 7

//BAUD=FOSC/(16(UBRR+1)) 异步模式 FOSC=7.3728M

/***************************************/
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x02;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x02;
}
/**************************************/
void uart0_init(void)
{
UCSRB = 0x00; //清零RXEN、TXEN
UCSRA = 0x02; //倍速
UCSRC = 0x06; //8位、无校验
UBRRL = 0x5F; //
UBRRH = 0x00; //波特率9600
UCSRB = 0x18; //使能RXEN、TXEN
}

void init_devices(void)
{
// __disable_interrupt();
port_init();
uart0_init();
}
/********************************/
void uart0_send(unsigned char i)
{
while(!(UCSRA&(1<<UDRE)));
UDR=i;
}
//接收区************************************************/
unsigned char uart0_receive(void)
{
//unsigned char status;
//status=UCSRA;
while(!(UCSRA&(1<<RXC)))
return UDR;
//if(status&(1<<FE))
//return 9;
//if(status&(1<<DOR))
//return 8;
//if(status&(1<<PE))
//return 7;

}
/******************************************/
void main(void)
{
unsigned char temp,k;
init_devices();
while(1)
{
temp=uart0_receive(); //接收
//uart0_send(0X0A); //发送
k=temp;
if(k==0x03)
PORTA=0X00;
}
}

使用外部晶振7。3728,熔丝位设为外部晶振高频,COM口:8位,9600,无校验,1停止位

问题:1,单独调试发送功能时,很正常,串口调试助手能接收到所发送的字符;2,单独调试接收功能时,串口调试助手的接收区无任何反应,接收不到任何字符;3,单独调试接收功能时,仿真器监控k,temp的变量变化,发现一直为0X00,同时使用单步调试,时已确认进入 while(!(UCSRA&(1<<RXC))) return UDR;

请问:为什么会没有反应呢???
...全文
136 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesea87 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 happy0755 的回复:]
引用 6 楼 jldream110 的回复:
将232 收发两个脚短接 判断 232 部分是否正常 如果正常 再找单片机的原因


哪两个收发脚?是MAX232到AVR这端还是PC到MAX232那端?这样会不会发生短路?
[/Quote]
短路AVR的收发引脚,然后用串口调试精灵发一个字符,看能不能收到,若不能收到,证明电平转换的电路存在问题
cbyibby 2010-07-09
  • 打赏
  • 举报
回复
串口通信如果连乱码都看不到,要么是连接问题,要么是硬件问题
galle 2010-07-09
  • 打赏
  • 举报
回复
初始化的时候,一定要先关全局中断,初始化完成后打开。
stdio.H中有专门的发送和接收的函数。

#include "io8515.h"
#include "stdio.h"
void main(void)
{
unsigned char temp;
UBRR = 12;
UCR=0x18;
puts("Hello World!\n");
putchar(0x0d);
putchar(0x0a);
printf("请使用PC机键盘输入数字、字母或汉字!");
putchar(0x0a);
putchar(0x0d);
while (1)
{
temp=getchar();
if (temp!=0)
{
putchar(temp);
if(temp==0x0d)
putchar(0x0a);
temp=0;
}
}
}
happy0755 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bluesea87 的回复:]
求硬件原理图,电平变换芯片用的是什么
[/Quote]

电平转换芯片是MAX232,硬件电路在DATASHEET里面有。
happy0755 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jldream110 的回复:]
将232 收发两个脚短接 判断 232 部分是否正常 如果正常 再找单片机的原因
[/Quote]

哪两个收发脚?是MAX232到AVR这端还是PC到MAX232那端?这样会不会发生短路?
bluesea87 2010-07-09
  • 打赏
  • 举报
回复
求硬件原理图,电平变换芯片用的是什么
jldream110 2010-07-09
  • 打赏
  • 举报
回复
将232 收发两个脚短接 判断 232 部分是否正常 如果正常 再找单片机的原因
91program 2010-07-08
  • 打赏
  • 举报
回复
用示波仪看看RX/TX的信号是否正常
贝隆 2010-07-08
  • 打赏
  • 举报
回复
关注。。。。。。。。
happy0755 2010-07-08
  • 打赏
  • 举报
回复
AVR发送数据时,用显波器检测RS232口的接收端,波形很正常;
用串口调试助手发送数据,AVR接收时,用显波器检测RS232的发送端,发现波形不对,只有3个方波,而且频率很慢,把AVR断电,再测,还是一样,调试助手的接收区也没有任何字符显示。再把波特率降到4800,效果一样。
怎么回事呢?

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧