RS485发送数据后再接收命令就出问题

2019-07-21 06:41发布

RS485从机接收上位机的命令做出响应,只要从机不发送数据,只接收命令可以接到命令就做出响应,如果从机发送数据给上位机,下次接收到命令从机不做响应了,连续发送四次命令只有第四次才做出响应,不清楚是怎么回事。附上接收发送部分的程序

接收:
void USART3_IRQHandler(void)
{
u8 res;    
 
  if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收到数据
{
res =USART_ReceiveData(USART3); //读取接收到的数据
if((RS485_RX_CNT&0x8000)==0)//接收未完成
{
if(RS485_RX_CNT&0x4000)//接收到了0x23 #
{
if(res!=0x0a)RS485_RX_CNT=0;//接收错误,重新开始
else
RS485_RX_CNT|=0x8000; //接收完成了
}
else //还没收到# 0x23
{
if(res==0x23)
RS485_RX_CNT|=0x4000;//接收到了#
else
{
USART3_RX_BUF[RS485_RX_CNT&0X3FFF]=res ;
RS485_RX_CNT++;
if(RS485_RX_CNT>(USART3_REC_LEN-1))RS485_RX_CNT=0;//接收数据错误,重新开始接收  
}  
}
}    
}    

发送:
//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_EN=1; //设置为发送模式
  for(t=0;t<len;t++) //循环发送数据
{   
USART_SendData(USART3, buf[t]);//向串口3发送数据
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}  
while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
RS485_RX_CNT=0;//状态清零  
RS485_TX_EN=0;//设置为接收模式
}


主函数中判断:
if(RS485_RX_CNT&0x8000) //如果接收完成1000 0000 0000 0000

len=RS485_RX_CNT&0x3FFF;// 0011 1111 1111 1111
for(t=1;t<len;t++) 

cmd[t-3]=USART3_RX_BUF[t];
printf("%c",cmd[t-3]);
id_num[t-1]=USART3_RX_BUF[t];
}
for(i=3;i<15;i++)//截取电机控制命令
{
speed_cmd[i-3]=USART3_RX_BUF;//电机命令 motor1_speed  12
}
for(i=3;i<11;i++)//截取LED控制命令
{
led_cmd[i-3]=USART3_RX_BUF;//LED命令led1_cmd  8
}
RS485_RX_CNT=0; //接收状态置零
USART_ClearFlag(USART3, USART_FLAG_RXNE); //清除接收中断

24 21 26 72 65 70 6C 79 5F 69 64 23 0A   24 21 26 72 65 70 6C 79 5F 69 64 23 0A  24 21 26 72 65 70 6C 79 5F 69 64 23 0A 24 21 26 72 65 70 6C 79 5F 69 64 23 0A 21 26 0D 0A  只有第四次接收到命令才返回数据,每次都是这样,不知道是怎么回事
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
zhang1116quan
1楼-- · 2019-07-21 11:51
RS485从机发送完数据后好像缓冲区还有数据,再次接收数据这次的数据是乱码,跟着接收两次数据好像可以清空缓冲区,第四次就可以接收到正确的命令,怎么可以发送完数据后再接收一次数据就有效?
正点原子
2楼-- · 2019-07-21 14:44
 精彩回答 2  元偷偷看……
mil234
3楼-- · 2019-07-21 20:37
有时错误在硬件上,特别是RS485芯片。从某宝上买的开发板,485芯片很大可能是劣质品。我自己有过经历,调试了一天半,最后确定是RS485芯片问题,买了颗新的正品,换上去,问题马上解决。

解决完心里有些小激动,马上回来给大家汇报下,以免有同样问题的筒子们再走我的冤枉路。

一周热门 更多>