dsPic30F5015,上电复位后电脑发送给单片机的第一个字节接收不到,以后都正常。求指点

2020-02-09 09:19发布

dsPic30F5015,上电复位后,电脑给单片机发送的第一个字节数据总是丢失,而从第二个字节就都能正确接收!

看了数据手册关于串口的介绍,也没找到相关的内容,无奈还是请高人指点了!

请……高手给指点!

已经大概知道是指针的使用出了问题,但是找不出问题的所在,串口能接收到第一个字节的数据,但经过指针后的处理就把复位后的第一个字节整没了,

不知道问题在哪里,继续等……


#define        BAUDRATE                19200
#define UART_RECEIVE_BUF_LEN         0x10
#define UART_SEND_BUF_LEN         0x10
#define UART_RECEIVING         0x80
#define UART_RECEIVED                0x40
#define UART_NOT_RECEIVED        0
#define UART_RECEIVE_TIMEOUT         10

typedef struct
{
        unsigned char         state;                                                        //串口状态
        unsigned char         combyte;                                                        //命令字
        unsigned char         ReceiveLen;                                                //接收到数据长度
        unsigned char         ReceiveBuf[UART_RECEIVE_BUF_LEN ];        //接收缓冲区
        unsigned char        *Receiveptr;                                                //接受指针
        unsigned char        Rewaittime;                                                        //接收等待时间
        unsigned char         SendLen;                                                        //要发送数据长度
        unsigned char         *SendPtr;                                                        //发送指针
        unsigned char         SendBuf[UART_SEND_BUF_LEN];                        //发送缓冲       
}
UartStruct;                //串口结构

//在此可添加用户程序中使用的全部变量
UART1        UartStruct UartStr;
UART1         unsigned int         TickFlag;        //主程序循环计数


///////////////////////////////////////////////////////////////////////////////////////////////////
// 名称:                __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
// 功能:                主程序运行及时;判断UART1接受数据完成
// 入口参数:         无
// 出口参数:        无
///////////////////////////////////////////////////////////////////////////////////////////////////
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void)
{  
        IFS0bits.T1IF = 0;/* Clear Timer interrupt flag */
        TickFlag ++;
        if(TickFlag==10000){
                TickFlag=0;
                LED3_FLASH;
                if(PumpRunTime_Flag){        //LED闪烁指示程序运行                                                                                                       
                    PumpRunTime--;       
//                        LED2_FLASH_N(6,50);
                }
        }
        if(UartStr.state&UART_RECEIVING ){       
                UartStr.Rewaittime++;        //接收等待时间自加
                if(UartStr.Rewaittime>UART_RECEIVE_TIMEOUT){//接收等待时间超时       
                        UartStr.Receiveptr=UartStr.ReceiveBuf;
                        UartStr.Rewaittime=0;
                        UartStr.state = UART_RECEIVED;       
                        if(UartStr.state&UART_RECEIVED){//判断是否有止命令
                                if(UartStr.ReceiveBuf[0]==0xbb&&UartStr.ReceiveBuf[1]==0x00){
                                        PumpState=0;
                                        PumpRunTime = 0;                               
                                        RRS1_220_OFF;
                                        RRS2_220_OFF;       
                                        RRS3_24_OFF;
                                        MotorStruct[0].MoveFlag = 0;
                                        MotorStruct[1].MoveFlag = 0;
                                        MotorStruct[2].MoveFlag = 0;                                       
                               
                                }
                                if(UartStr.ReceiveBuf[0]==0xbb&&UartStr.ReceiveBuf[1]==0x01){
                                        PumpState=0x10;
                                        PumpRunTime = 0;
                                        MotorStruct[0].MoveFlag = 0;
                                        MotorStruct[1].MoveFlag = 0;
                                        MotorStruct[2].MoveFlag = 0;                               

                                }
                        }
                }
         }
       
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// 名称:                __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void)
// 功能:                UART1接收数据中断
// 入口参数:         无
// 出口参数:        无
///////////////////////////////////////////////////////////////////////////////////////////////////
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void)
{
        IFS0bits.U1RXIF = 0;        // clear interrupt flag
        if(UartStr.ReceiveLen<UART_RECEIVE_BUF_LEN){
                *UartStr.Receiveptr++=U1RXREG;
                UartStr.ReceiveLen++;
                UartStr.state |= UART_RECEIVING;
                UartStr.Rewaittime=0;
        }
       
}
0条回答

一周热门 更多>