fengche1915 2022-10-21 12:13 采纳率: 0%
浏览 131
已结题

STM32 主机对11从机modbus通信卡死问题

问题遇到的现象和发生背景

使用的是stm32系列的407ZGT6做主机,103VET6做从机,采用modbus485通信,主机轮流查询11个从机的寄存器数据(03指令),从机返回相应指令对应的寄存器数据;刚开机一会儿没问题,每个从机都能发回相应的寄存器数据回来;但是大概几分钟后或者更长时间,从机慢慢的就卡死了(用了一个指示灯闪烁判断),现在就是从机为什么会卡死,网上都说是什么ORE中断那些,好像试了下还是没能解决问题

用代码块功能插入代码,请勿粘贴截图

从机使用的串口中断接收主机发来的数据;以下贴的代码都是从机的代码,cubemx生成的标准的hal库函数

void USART2_IRQHandler(void)//串口2接收中断函数
{
  /* USER CODE BEGIN USART2_IRQn 0 */
  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

      HAL_UART_Receive_IT(&huart2, (uint8_t *)&RES,1); 
    if( modbus.reflag==1)  //有数据包正在处理
    {
           return ;
    }        
        modbus.rcbuf[modbus.recount++] = RES;
        modbus.timout = 0;
        
        if(modbus.recount == 1)  //已经收到了第一个字符数据
        {
          modbus.timrun = 1;  //开启modbus定时器计时
        }
//这个代码就是典型的modbus485通信的代码

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器中断回调函数
{
    if (htim->Instance == TIM1)     
    {
        if(modbus.timrun != 0)//运行时间!=0表明已经接收到了一个数据了
         {
          modbus.timout++;
          if(modbus.timout >=8)    //8ms接收完数据
          {
           modbus.timrun = 0;
             modbus.reflag = 1;//接收数据完毕
          }
        }
        }
        
        modbus.Host_Sendtime++;//发送完上一帧后的时间计数
         if(modbus.Host_Sendtime>1000)//距离发送上一帧数据1s了
            {
                //1s时间到
                modbus.Host_time_flag=1;//发送数据标志位置1                
            }
}

主函数中为Modbus_Event处理的0306函数;
        if(modbus.Host_time_flag)//1s发送一次数据  //作为从机使用
        {
            modbus.Host_time_flag=0;//20220728
            Modbus_Event();
            osDelay(10);
        }                

运行结果及报错内容

刚开机的时候,11个主机都能正常返回主机对应的命令;但是时间一长几分钟甚至几十分钟慢慢的从机就失联了,工作指示灯灭或者长亮了;

我的解答思路和尝试过的方法

试过将从机的发回的数据屏蔽掉,只做接收主机发来的数据;但是时间长了还是卡死,看来不是发生在从机发送数据给主机这里,而是从机接收数据这里;

我想要达到的结果

解决掉从机死机的问题

img

  • 写回答

8条回答 默认 最新

  • 蓝天居士 《人工智能从入门到进阶实战》作者 2022-10-21 12:43
    关注

    先少接几个,比如先接1个,看看有没有这样的问题。如果有,和数量即负载无关,检查程序;如果没有问题,接2个设备,5个设备……如果设备数量超过一定值才会出现,增大轮询间隔

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月28日
  • 赞助了问题酬金15元 10月21日
  • 赞助了问题酬金1元 10月21日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 网站设计与开发职业技能大赛试题
  • ¥20 在使用CESM2.2.0模型进行case.submit过程中出现如下错误(关键词-Map)
  • ¥15 有办法改变通过wifi进入的网站的设置吗
  • ¥15 所以到底怎么算!算到凌晨五点都算不出来!
  • ¥15 label_studio
  • ¥15 请教如何phython发邮件
  • ¥15 linux系统安装问题
  • ¥15 路径规划如何采用矢量法让他们尽量在一个方向
  • ¥15 crypto 一道rsa解密题
  • ¥15 survIDINRI已将生存时间转为数值变量,仍错误 Time variable is not numeric。