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 只有第四次接收到命令才返回数据,每次都是这样,不知道是怎么回事
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
解决完心里有些小激动,马上回来给大家汇报下,以免有同样问题的筒子们再走我的冤枉路。
一周热门 更多>