OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8511|回复: 3

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

[复制链接]

7

主题

38

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2015-4-25
在线时间
158 小时
发表于 2015-6-16 15:36:01 | 显示全部楼层 |阅读模式
5金钱
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  只有第四次接收到命令才返回数据,每次都是这样,不知道是怎么回事

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

38

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2015-4-25
在线时间
158 小时
 楼主| 发表于 2015-6-16 16:16:33 | 显示全部楼层
RS485从机发送完数据后好像缓冲区还有数据,再次接收数据这次的数据是乱码,跟着接收两次数据好像可以清空缓冲区,第四次就可以接收到正确的命令,怎么可以发送完数据后再接收一次数据就有效?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-16 23:18:46 | 显示全部楼层
这个解决好逻辑问题应该就问题不大了
慢慢调试下吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-12-17
在线时间
0 小时
发表于 2018-12-17 18:13:06 | 显示全部楼层
有时错误在硬件上,特别是RS485芯片。从某宝上买的开发板,485芯片很大可能是劣质品。我自己有过经历,调试了一天半,最后确定是RS485芯片问题,买了颗新的正品,换上去,问题马上解决。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 01:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表