打印
[AVR单片机]

大家帮我看下我的avr串口程序发送指令发不了,接收乱码

[复制链接]
1904|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
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define u8 unsigned char
#define u16 unsigned int

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

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

void Init_USART()
{
        UCSRB|=_BV(TXEN)|_BV(RXEN)|_BV(RXCIE);        //使能发送
        UCSRC|=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);//8位数据位
        UBRRL=(F_CPU/19200/16-1)%256;
        UBRRH=(F_CPU/19200/16-1)/256;
}
//发送一个字节
void TxByte(u8 Byte)
{
        UDR=Byte;
        while(!(UCSRA&_BV(UDRE)));
        _delay_ms(2);
}
//发送一个字
void TxWord(u16 Word)
{
        TxByte(Word/256);//发送高字节
        TxByte(Word%256);//发送低字节
}
//发送多个字节
void TxSting(u8 TxD[],u8 t)
{
        u8 t1;
        for (t1=0;t1<t;t1++)
        {
                TxByte(TxD[t1]);
        }
}
int main(void)
{
        DDRD=0xf2;
        PORTD=0XFF;
        Init_USART();
        sei();
        TxSting(TxD_CRC,5);
    while(1)
    {
               
                if ((RxD[1]==0x83)&&(RxD[3]==0x10))        //06 83 00 10 01 00 01
                {
                        TxWord(0x5AA5);
                        TxD_CRC[4]=RxD[6];
                        CRC_16(TxD_CRC,5);
                        TxSting(TxD_CRC,5);
                        TxByte(crch);
                        TxByte(crcl);
                        RxD[1]=0;
                        RxD[3]=0;
                }
                _delay_us(500);
                if ((RxD[1]==0x82)&&(RxD[2]==0xff))
                {
                       
                }
               
    }
}

使用特权

评论回复
地板
war3mars| | 2015-2-17 21:47 | 只看该作者
我也是串口有问题,我是atmel128的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

19

帖子

0

粉丝