PIC16F883串口

2020-02-08 12:20发布

用PIC16F883作485通信,程序如下:
void interrupt SerialAndTimer1(void)
{
        if (RCIF&RCIE)
        {
                RCIF=0;
                if(ModbusHead>=ModbusTime)
                {
                        RxUartBuf[RxIndex++]=RCREG;
                }
                else        if(ModbusHead<ModbusTime)
                        ModbusHead=0;
                if((RxIndex)&&(ModbusTail<ModbusTime))
                        ModbusTail=0;
                return;
        }
       
        if(TXIF&TXIE)
        {
                //TXIF=0;
                if(TxNum<TxIndex)
                        TXREG=TxUartBuf[TxNum++];
                else        if(TxNum==TxIndex)
                {
                        TxNum++;
                        while(!TRMT);
                        TXEN=0;
                        Rs485RxEn;
                        ClrBufInt(TxUartBuf,UartBufLen);
                        TxNum=0; TxIndex=0;
                        if(CfgModeIsIn)
                        {
                                RFMODULEOUTCFG;
                                CfgModeIsIn=0;
                                SPBRG=BaudArray[0];
                        }
                }
               
        }
       
        if(TMR1IF==1)
        {
                TMR1ON=0;         //停止计时
                LoopTime++;
                if(RfStatus.databit.RST)
                {
                        RfRstTime++;
                        if(RfRstTime>3000)
                        {
                                RfRstTime=0;
                                RFMODULEOUTRST;
                                RfStatus.databit.RST=0;
                        }
                }
                if(RfStatus.databit.CFG)
                {
                        RfCfgTime++;
                        if(RfCfgTime>3000)
                        {
                                RfCfgTime=0;CfgModeIsIn=1;
                                RfStatus.databit.CFG=0;
                        }
                }
                TMR1IF=0;
                if((!RxIndex)&&(ModbusHead<ModbusTime))                //当串口准备接收数据的时候,进行延时计数,判断帧头
                {
                        ModbusHead++;
                }       
                else        if((RxIndex)&&(ModbusTail<ModbusTime))        //当串口接收到数据的时候,进行延时计数,判断帧尾
                {
                        ModbusTail++;
                }
                TMR1H=0xfe;
                TMR1L=0xa6;                        //定时100ms   
              TMR1ON=1;         //启动计时
              return;
        }
}

void UartInitial(void)
{
        TXSTA=0X00;              //八位数据发送,异步低速主控模式
        RCSTA=0X90;              //八位数据接收,连续接收
        BAUDCTL=0X40;            //8位波特率产生器
        SPBRG=BaudArray[BaudNum];                //波特率9600;spbrg=Fosc/(64*baudrate)-1
       
}
void        AdInit()
{
        SSPSTAT=0xc0;                //---SMP---CKE---D/A---P---S---R/W---UA---BF
                                                //---1-----1-------------------------------
                                                //末尾采样输入数据,上升沿发送数据
        SSPCON=0x22;                //---WCOL---SSPOV---SSPEN---CKP---SSPM
                                                //------------------1-------------0010
                                                //使能串行口,主控模式,时钟为Fosc/64
}
void        McuInitial()
{
        ANSEL=0x00;
        ANSELH=0x00;
        TRISA=0x17;
        TRISB=0xff;
        TRISC=0xd4;                        //SDO配置为输出,SDI配置为输入,SCK配置为输出。其余默认
        LocalAdr=PORTB&0x1f;
        BaudNum=PORTB&0xe0;
        BaudNum>>=5;
        BaudNum=0;
        TMR1Initial();
        UartInitial();
        AdInit();
        ei();
        PEIE=1;
        TXIE=1;RCIE=1;TMR1IE=1;
        TMR1ON=1;
}
void        main()
{
        asm("NOP");
        McuInitial();
        CorrectOver1=eeprom_read(CorrectFlag1);
        CorrectOver2=eeprom_read(CorrectFlag2);
        if((CorrectOver1!=0x55)||(CorrectOver2!=0x55))
        {}

        while(1)
        {
                TxUartBuf[TxIndex++]=0x55;
                Send_Com();
        }
但发现串口无数据接收,不知道怎么回事,初次使用883系列,还望大家告知指点,项目急,连夜加班。。。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。