jinshaopu 发表于 2014-4-18 11:12:25

avr串口和PC通信问题

本帖最后由 jinshaopu 于 2014-4-18 11:14 编辑

PC端的程序和C51在多机通信(模式3 SM2=1)模式下工作正常

但是在Protues下仿真的时候
AVR下的接收,不论是发的地址还是数据 IsAdd()都是真,也就是RX8总是1,大侠来指导下是什么情况

#define IsAdd()    (UCSRB&2)

void SerialInit(void)
{
        //设置波特率
        UBRRL = 0x33;
        UBRRH = 0x00;
       
        //RXC   TXC   UDRE    FE    DOR   PE   U2XMPCM
        //RXC:接收结束
        //TXC:发送结束
        //UDRE:数据寄存器空
        //FE:帧错误
        //DOR:数据溢出
        //PE:校验错误
        //U2X:倍速发送
        //MPCM:多处理器通信模式1:接收有地址   0:接收数据
        UCSRA=1;

    //接收发送使能
        //RXCIE    TXCIE   UDRIE   RXEN   TXENUCSZ2RXB8TXB8
        //RXCIE:接收结束中断使能
        //TXCIE:发送结束中断使能
        //UDRIE:数据寄存器空中断
        //RXEN:接收使能
        //TXEN:发送使能
        //USCZ2:字符长度
        //RXB8:接收数据位8
        //TXB8:发送数据位8
        UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2);

        //URSEL   UMSELUPM1   UPM0USBS   UCSZ1UCSZ0UCPOL
        //URSEL:寄存器选择
        //UMSEL:串口模式选择0:异步   1:同步
        //UPM1,UPM0:奇偶校验模式。00:禁止 01:保留10:偶校验11:奇校验
        //USBS:停止位选择0:1位1:2位
        //UCSZ2,UCSZ1,UCSZ0:字符长度。111:9位011:8位010:7位001:6位   000:5位
        //UCPOL:时钟极性(仅在同步模式下有用)
        //
        //
        UCSRC=0x80|(3<<UCSZ0);        //设置数据格式:无校验, 9个数据 1个停止位
       
        R485();
}

ISR(SIG_UART_RECV)
{
        uint8 add,temp;
        if( DataError() )//接收出错就重新打开地址帧筛选功能
        {
                temp=UDR;
                OSQFlush(SerialInData);
                AddOn();
        }
        else      
        {               
                if (IsAdd())           //地址
                {
                        add=UDR;
                        if (add==address)
                        {
                                AddOff();
                        }
                        else
                        {
                                AddOn();
                        }
                }
                else                   //数据
                {
                        temp=UDR;
                        #if EN_OS_Q_POST > 0
                OSQPost(SerialInData,temp);
                        #endif
                        #if EN_OS_Q_POST_FRONT > 0
                OSQPostFront(SerialInData,temp);
                        #endif
                }
        }
}
页: [1]
查看完整版本: avr串口和PC通信问题