[AVR单片机] 大家帮我看下我的avr串口程序发送指令发不了,接收乱码

[复制链接]
2233|3
 楼主| 282045368 发表于 2015-1-8 19:22 | 显示全部楼层 |阅读模式
有时候串口调试助手接收到是乱码,有时候接收不到数据。
我是用proteus +串口仿真工具调试的
另外大家有比较好的串口程序提供下给我。谢谢了。
#include <mega64.h>
#include <delay.h>



#define F_CPU 7372800
#define BAUD 9600


void UartInitial(void)
{
    #asm("cli");
    #asm("nop");
    UCSR0B = 0x00; //disable while setting baud rate   
    UCSR0A = 0x00;//设置U2X = 0,1倍率发送

    UBRR0L = (F_CPU/(16*BAUD))%256;
    UBRR0H = (F_CPU/(16*BAUD))/256;

    UCSR0C = 0x06;//奇偶模式无,八位数据位,一位停止位
//    UCSR0B =(1<<RXEN0)|(1<<TXEN0);//接收使能和发送使能
    UCSR0B =(1<<TXEN0);
    #asm("sei");
    #asm("nop");         
}

//初始化之后就是对USART0进行读写了.
//UCSR0A的Bit5-UDRE0标志指出发送缓冲器UDR0是否准备好接收新数据,
//UDRE0为1说明缓冲器为空,可以接收新数据
//UDRE0标志也可用来产生寄存器空中断.复位后的UDRE0置位,表明发送器已经就绪:

void putchar (unsigned char c)
{
    while(!(UCSR0A&(1<<UDRE0))) ;//当UCSR0A的UDRE0位为1时,说明缓冲器为空,已经准备接收数据
    UDR0 = c;
}

void putstr (unsigned char *s)  //串口0发送字符串
{
    while(*s)
    {     
        putchar(*s);
        s++;

    }
    putchar(0x0a);//回车换行


}

//RXC0为UCSR0A里的Bit7位,为USART0接收结束的状态位
//接收缓冲器中有未读出的数据时RXC0置位,否则清零

unsigned char getchar (void)
{
    while(!(UCSR0A&(1<<RXC0)));
    return UDR0;
}


void main()
{
    UartInitial();
    putstr("Aaaa");
    while(1)
    {
        putstr("iloveyou");

    }
}

yklstudent 发表于 2015-1-8 19:36 | 显示全部楼层
发送太快了
加个延时看看
moyansen 发表于 2015-1-15 22:02 | 显示全部楼层
protues调试不太好使的,我之前在protues怎么都无**常收发数据,用真实的板子才能正常收发
下面是我的程序,你可以参考一下,编译环境是Atmel Studio6.2
  1. #define F_CPU 8000000UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>

  5. #define u8 unsigned char
  6. #define u16 unsigned int

  7. u8 TxD_CRC[5]={0x82,0x00,0x12,0x00,0x00},TxD_CRC_FLAG;
  8. u8 Rx5A=0X00,RxA5=0X00,Rx_Flag=0x00,Rx_Len=0,RxD[20]={0};

  9. const u8 CRCTABH[256]={        0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
  10.                                                 0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
  11.                                                 0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
  12.                                                 0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
  13.                                                 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
  14.                                                 0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
  15.                                                 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
  16.                                                 0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
  17.                                                 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
  18.                                                 0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
  19.                                                 0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
  20.                                                 0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
  21.                                                 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
  22.                                                 0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
  23.                                                 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
  24.                                                 0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
  25.                                                 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
  26.                                                 0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
  27.                                                 0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
  28.                                                 0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
  29.                                                 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
  30.                                                 0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
  31.                                                 0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
  32.                                                 0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
  33.                                                 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
  34.                                                 0x80,0x41,0x00,0xC1,0x81,0x40};
  35. const u8 CRCTABL[256]={        0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,
  36.                                                 0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,
  37.                                                 0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
  38.                                                 0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,
  39.                                                 0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,
  40.                                                 0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
  41.                                                 0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,
  42.                                                 0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
  43.                                                 0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
  44.                                                 0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,
  45.                                                 0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,
  46.                                                 0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
  47.                                                 0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,
  48.                                                 0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,
  49.                                                 0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
  50.                                                 0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
  51.                                                 0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,
  52.                                                 0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
  53.                                                 0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,
  54.                                                 0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
  55.                                                 0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
  56.                                                 0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,
  57.                                                 0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,
  58.                                                 0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
  59.                                                 0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,
  60.                                                 0x43,0x83,0x41,0x81,0x80,0x40};
  61. //CRC校验函数
  62. u8 crch,crcl,i_len;
  63. void CRC_16(u8 txdat[],u8 j)
  64. {
  65.         u8 index=0;
  66.         crch=0xff;
  67.         crcl=0xff;
  68.         for(i_len=0;i_len<j;i_len++)
  69.         {
  70.                 index=crch^txdat[i_len];                 //txdat[i] 是发送数据
  71.                 crch=crcl^CRCTABH[index];
  72.                 crcl=CRCTABL[index];
  73.         }
  74. }

  75. void Init_USART()
  76. {
  77.         UCSRB|=_BV(TXEN)|_BV(RXEN)|_BV(RXCIE);        //使能发送
  78.         UCSRC|=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);//8位数据位
  79.         UBRRL=(F_CPU/19200/16-1)%256;
  80.         UBRRH=(F_CPU/19200/16-1)/256;
  81. }
  82. //发送一个字节
  83. void TxByte(u8 Byte)
  84. {
  85.         UDR=Byte;
  86.         while(!(UCSRA&_BV(UDRE)));
  87.         _delay_ms(2);
  88. }
  89. //发送一个字
  90. void TxWord(u16 Word)
  91. {
  92.         TxByte(Word/256);//发送高字节
  93.         TxByte(Word%256);//发送低字节
  94. }
  95. //发送多个字节
  96. void TxSting(u8 TxD[],u8 t)
  97. {
  98.         u8 t1;
  99.         for (t1=0;t1<t;t1++)
  100.         {
  101.                 TxByte(TxD[t1]);
  102.         }
  103. }
  104. int main(void)
  105. {
  106.         DDRD=0xf2;
  107.         PORTD=0XFF;
  108.         Init_USART();
  109.         sei();
  110.         TxSting(TxD_CRC,5);
  111.     while(1)
  112.     {
  113.                
  114.                 if ((RxD[1]==0x83)&&(RxD[3]==0x10))        //06 83 00 10 01 00 01
  115.                 {
  116.                         TxWord(0x5AA5);
  117.                         TxD_CRC[4]=RxD[6];
  118.                         CRC_16(TxD_CRC,5);
  119.                         TxSting(TxD_CRC,5);
  120.                         TxByte(crch);
  121.                         TxByte(crcl);
  122.                         RxD[1]=0;
  123.                         RxD[3]=0;
  124.                 }
  125.                 _delay_us(500);
  126.                 if ((RxD[1]==0x82)&&(RxD[2]==0xff))
  127.                 {
  128.                        
  129.                 }
  130.                
  131.     }
  132. }
war3mars 发表于 2015-2-17 21:47 | 显示全部楼层
我也是串口有问题,我是atmel128的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部