485通讯字节丢失

2019-07-20 07:37发布

问题是,我是探索者通过串口2转485控制电机,在主机发送完控制指令等待接收反馈信息时,仿真在接收函数里设置断点数据就正常,但是把断点取消,就会有丢失反馈信息的部分字节,请各位道友给看看指导一下?测试显示结果:
                 1、单独发送请求电机1电流信息,接受的数据正常
                 2、单独发送请求电机2电流信息,接收的数据正常
                 3、先发电机1后发电机2,接收电机1正常,接收电机2只收到实际反馈信息第一个字节
                 4、先发电机2后发电机1,接收电机2正常,接收电机1只收到实际反馈信息第一个字节
                 5、在485接收函数里设置断点,不论先发电机1还是电机2 ,收发都是正常的。


这是发送请求电机电流信息的函数
[mw_shl_code=c,true]void Get_CurElectric_Value(void)
{
        u8 tempbuf1[64] = {0};
        u8 tempbuf2[64] = {0};
        u8 revcount;

        memset(RS485_RX_BUF,0,64);
        memset(tempbuf1,0,64);
        RS485_Send_Data(rs485_MOTORCURR[0],8);//请求电机1电流信息
        RS485_Receive_Data(tempbuf1,&revcount);

        rightelectricval = 0;
        rightelectricval = tempbuf1[3]<<8;
        rightelectricval += tempbuf1[4];

       
        memset(RS485_RX_BUF,0,64);
        memset(tempbuf2,0,64);

        RS485_Send_Data(rs485_MOTORCURR[1],8);//请求电机2电流信息
        RS485_Receive_Data(tempbuf2,&revcount);

        leftelectricval = 0;
        leftelectricval = tempbuf2[3]<<8;
        leftelectricval += tempbuf2[4];
       
}[/mw_shl_code]

这是485发送数据函数
[mw_shl_code=c,true]//RS485发送len个字节
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN=1;                        //设置为发送模式
        delay_ms(10);
          for(t=0;t<len;t++)                //循环发送数据
        {
                while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);//等待数据发送结束
                 USART_SendData(USART2,buf[t]); //发送数据
        }         
        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);//等待数据发送结束
        RS485_RX_CNT=0;          
        RS485_TX_EN=0;                                //设置为接收模式
        delay_ms(10);
}[/mw_shl_code]
这是485接收函数
[mw_shl_code=c,true]//RS485查阅接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
        CPU_SR_ALLOC();
       
        u8 rxlen=0;
        u8 i=0;
        *len=0;                                //默认为0
        delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
        OS_CRITICAL_ENTER();        //关中断,进入临界区
        rxlen=RS485_RX_CNT;
        if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=RS485_RX_BUF;       
                }               
                *len=RS485_RX_CNT;        //记录本次数据长度
                RS485_RX_CNT=0;                //清零
        }
        OS_CRITICAL_EXIT();        //开中断,退出临界区
}[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。