r123h

    1. 程序在运行时进入HardFault_Handler中 8/581 stm32/stm8 2024-05-09
      littleshrimp 发表于 2024-5-9 12:48 bufferRec只有30个字节,如果串口接收长度大于30就可能溢出
      我将获取串口数据的程序改成了动态分配内存的目前还没有进到HardFault_Handler中,我再测一段时间试试
    2. 程序在运行时进入HardFault_Handler中 8/581 stm32/stm8 2024-05-09
      同样是对天平操作的代码,读取天平的重量和其他部分的运行,因为数量很多所以采用了递归的方法 void ProcessSamples(int samplePositions[],u16 num,int totalSamples,u32 *Weightbuffer) { if (num >= totalSamples) { return; } ProcessSample(samplePositions[num],Weightbuffer); ProcessSamples(samplePositions, num + 1, totalSamples,Weightbuffer); } void ProcessSample(u16 Samplenum,u32 *Weightbuffer) { if(StartWorkFlag==false) return; SamplefromTurnTable(Samplenum); ArriveBalance(); delay_ms(100); u32 Recordweight=Weightbuffer[Samplenum-1]; while(readBalancebyUart(&Weightbuffer[Samplenum-1])==false) { delay_sec(2); } TaskParabuffer.CurSampleWeight=Weightbuffer[Samplenum-1]; ReturnTurntable(Samplenum); u32 differnum = abs(Weightbuffer[Samplenum-1]-Recordweight); if(differnum<=PCSetTaskPara.Balanceerronum) { Recordweight=0; PCSetTaskPara.bufferTask[Samplenum-1]=0; Weightbuffer[Samplenum-1]=0; } else{ Recordweight=0; } } bool readBalancebyUart(u32 *weight) { float data=0; u8 buffer[3] = {0}; buffer[0]=0x53; buffer[1]=0x0D; buffer[2]=0x0A; for(int i=0;i<3;i++) { while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET){}; USART_SendData(UART5,buffer[i]); } while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET){}; delay_ms(50); u8 bufferRec[30] = {0}; int recLen = 0; getUart5RecData(bufferRec,&recLen); if((bufferRec[0] == 0x53)&&(bufferRec[2] == 0x53)&&(bufferRec[8] == 0x2E)&& recLen == 0x12) { u8 dataAddr[9]= {0}; for(int i = 0;i<9;i++) { dataAddr[i] = bufferRec[5+i]; } data = atof((char*)dataAddr); if(data>150) { return false; } *weight=(u32)floor(data*100000); } else { return false; } return true; } 但是运行到ProcessSample的 while(readBalancebyUart(&Weightbuffer[Samplenum-1])==false)   {         delay_sec(2);   }时程序又进入到HardFault_Handler,然后通过调用堆栈窗口发现在程序运行到   ProcessSample函数的   u32 Recordweight=Weightbuffer[Samplenum-1];之前Samplenum和Weightbuffer的数值和地址是正常的,进入到while(readBalancebyUart(&Weightbuffer[Samplenum-1])==false)   {         delay_sec(2);   }后,Samplenum和Weightbuffer的地址就全不对了,原本Samplenum的值为3变为0x2036,Weightbuffer的地址从0x200043E0变为0x2000430A

最近访客

现在还没有访客

< 1/0 >

统计信息

已有--人来访过

  • 芯积分:25
  • 好友:--
  • 主题:2
  • 回复:2

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言