OpenEdv-开源电子网

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

原子485 modbus例程中遇到的问题

[复制链接]

13

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-2-2
在线时间
80 小时
发表于 2017-12-22 21:25:51 | 显示全部楼层 |阅读模式
(之前发的不是求助帖所以再发一贴求教)
我把论坛中原子的485上modbus例程一直到战舰串口1上,然后出现了两个问题。
第一个问题是在这个中断函数中 if(m_ctrl_dev.rxlen>(M_MAX_FRAME_LENGTH-1))m_ctrl_dev.rxlen=0;   为什么要选择减1?我用串口调试的时候每次发送一个数据rxlen就会加1代表了发送数据的个数,而M_MAX_FRAME_LENGTH是数据帧最大的个数261,应该不需要减1不是吗?

void USART2_IRQHandler(void)
{
        u8 res;        
        if(USART2->SR&(1<<5))                     
        {         
                res=USART2->DR;   
                if(m_ctrl_dev.frameok==0)        
                {
                        m_ctrl_dev.rxbuf[m_ctrl_dev.rxlen]=res;
                        m_ctrl_dev.rxlen++;
                        if(m_ctrl_dev.rxlen>(M_MAX_FRAME_LENGTH-1))m_ctrl_dev.rxlen=0;      
          }                                                                                                
        }else if(USART2->SR&(1<<4))               
        {
                res=USART2->DR;                       
                if(m_ctrl_dev.rxlen>=M_MIN_FRAME_LENGTH)m_ctrl_dev.frameok=1;               
                else m_ctrl_dev.rxlen=0;      
        }
}

第二个问题是串口总线空闲中断是什么时候进入的?调试时候断点打在if(USART2->SR&(1<<5))中不会进入空闲中断,打在else if(USART2->SR&(1<<4))中可以进入空闲中断。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 05:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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