atmega162串口接收数据是乱码?

2019-03-24 20:31发布

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


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




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

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<<UDRE0)));
  UDR0=com;
}

void send1_data(unsigned char com)
{
  while(!(UCSR1A&(1<<UDRE1)));
  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)
  {
    ;
  }

}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
chunyang
1楼-- · 2019-03-25 04:44
先用PC监看下位机发送的数据是否正确,如是,说明你的上位机程序不对。重点检查时钟设置和波特率设置以及串口模式。
qazplm3218
2楼-- · 2019-03-25 07:35
 精彩回答 2  元偷偷看……
qazplm3218
3楼-- · 2019-03-25 11:53
波特率都是:9600,
异步通讯,1个停止位,8位数据,无校验

jishuaihu
4楼-- · 2019-03-25 17:30
仿真的时候正确说明程序没问题啊,如果仿真可以烧进去不行的话有可能是仿真的时候和最终烧写进行后的时钟速率不一样,你改一下电脑上的波特率试试,或者直接拿示波器监视一下波特率是否正常
qazplm3218
5楼-- · 2019-03-25 22:59
是不是熔丝位设置不正确呢?
外接晶振:11.0592MHZ,熔丝位这样设置是否正确?

qazplm3218
6楼-- · 2019-03-26 00:45
我的下位机并不是电脑串口,而是PIC16F77+MAX232

一周热门 更多>