问题是,我是探索者通过串口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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
哈哈哈,只试了中间延时到50ms不行就以为不是延时问题,你这么一说,又试了一下发现最低需要100ms的延时才可以,感谢给予支持
一周热门 更多>