OpenEdv-开源电子网

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

485通讯字节丢失

[复制链接]

28

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2017-2-13
在线时间
110 小时
发表于 2018-6-21 14:44:41 | 显示全部楼层 |阅读模式
5金钱
问题是,我是探索者通过串口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]

最佳答案

查看完整内容[请看2#楼]

发送和接收之间的延时时间要设置合适
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
689
金钱
689
注册时间
2014-3-4
在线时间
96 小时
发表于 2018-6-21 14:44:42 | 显示全部楼层
发送和接收之间的延时时间要设置合适
回复

使用道具 举报

28

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2017-2-13
在线时间
110 小时
 楼主| 发表于 2018-6-21 14:45:26 | 显示全部楼层
@正点原子 原子哥
回复

使用道具 举报

28

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2017-2-13
在线时间
110 小时
 楼主| 发表于 2018-6-21 16:06:12 | 显示全部楼层
luckywwq 发表于 2018-6-21 15:26
发送和接收之间的延时时间要设置合适

试过在发送和接收之间再加一个10ms至50ms延时,也还是不行
回复

使用道具 举报

28

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2017-2-13
在线时间
110 小时
 楼主| 发表于 2018-6-21 16:16:08 | 显示全部楼层
爱奔跑的IT 发表于 2018-6-21 16:06
试过在发送和接收之间再加一个10ms至50ms延时,也还是不行

哈哈哈,只试了中间延时到50ms不行就以为不是延时问题,你这么一说,又试了一下发现最低需要100ms的延时才可以,感谢给予支持
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 03:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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