4262|6

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

atmega162串口接收数据是乱码? [复制链接]

ATMEGA162串口接收到的数据时乱码?   
ATMEGA162每隔1秒,向下位机发送命令,下位机收到命令后,向上位机发送数据,
上位机收到的全部都是十六进制的乱码。端口设置和波特率设置也都是正确的,下位机程序肯定没问题。


串口1发送数据,接收到数据以后,在通过串口0,发送出去,在电脑的串口显示出来。




程序如下,是否是程序有问题??是否是熔丝位设置有问题?
仿真的时候,收到的数据都是正常的。
#include
#include

unsigned char x,y;

void port_init(void)
{
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0xff;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0xFF;
}

void send0_data(unsigned char com)
{
  while(!(UCSR0A&(1<   UDR0=com;
}

void send1_data(unsigned char com)
{
  while(!(UCSR1A&(1<   UDR1=com;
}

UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00; //disable while setting baud rate
UBRR0L  =0x47; //set baud rate
UBRR0H = 0x00;
UCSR0C = BIT(URSEL0) | 0x06;
UCSR0A = 0x00; //enable
UCSR0B = 0x08; //enable

void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00; //disable while setting baud rate
UBRR1L =0x47; //set baud rate
UBRR1H = 0x00;
UCSR1C = BIT(URSEL1) | 0x06;
UCSR1A = 0x00; //enable
UCSR1B = 0x98; //enable
}

void timer0_init(void)
{
TCCR0= 0x00; //stop
TCNT0= 0x94; //set count
OCR0= 0x6C; //set compare value
TCCR0= 0x05; //start timer
}

#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC
void uart1_rx_isr(void)
{
  send0_data(UDR1);
}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
TCNT0= 0x94; //reload counter value
x++;
if(x==100)
{
  x=0;
  send1_data(0xA0);
  send1_data(0xA1);
  send1_data(0x0D);
}
}

void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
uart0_init();
uart1_init();
MCUCR= 0x00;
EMCUCR = 0x00;
TIMSK= 0x02; //timer interrupt sources
ETIMSK=0x00;
GICR= 0x00;
PCMSK0=0x00;
PCMSK1=0x00;
SEI(); //re-enable interrupts

}


void main(void)
{
  init_devices();
  while(1)
  {
    ;
  }

}

最新回复

仿真的时候正确说明程序没问题啊,如果仿真可以烧进去不行的话有可能是仿真的时候和最终烧写进行后的时钟速率不一样,你改一下电脑上的波特率试试,或者直接拿示波器监视一下波特率是否正常  详情 回复 发表于 2014-5-26 14:14
点赞 关注
 

回复
举报

1万

帖子

139

TA的资源

版主

沙发
 
先用PC监看下位机发送的数据是否正确,如是,说明你的上位机程序不对。重点检查时钟设置和波特率设置以及串口模式。
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
用PC监看下位机发送的数据时完全正确的,
上位机我也用PC,通讯了,也完全正确的
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

4
 
波特率都是:9600,
异步通讯,1个停止位,8位数据,无校验

 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 
仿真的时候正确说明程序没问题啊,如果仿真可以烧进去不行的话有可能是仿真的时候和最终烧写进行后的时钟速率不一样,你改一下电脑上的波特率试试,或者直接拿示波器监视一下波特率是否正常
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

6
 
是不是熔丝位设置不正确呢?
外接晶振:11.0592MHZ,熔丝位这样设置是否正确?

22.jpg (142.09 KB, 下载次数: 0)

22.jpg
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

7
 
我的下位机并不是电脑串口,而是PIC16F77+MAX232
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表