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条回答
qazplm3218
2019-03-26 00:45
我的下位机并不是电脑串口,而是PIC16F77+MAX232

一周热门 更多>