新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2023-9-15
- 在线时间
- 4 小时
|
5金钱
modbus读取多个寄存器的函数里面,定义了一个u8 buffer[8]的数组,对前6位crc校验过程时,buffer地址是0x200015F4,但是到了crc16函数中puchMsg指向了0x20010000,datalen也发生了改变,然后就跳转到HardFault了- bool readRegisterforweight(u8 slave_addr,u16 reg_addr,u16* data,u16 len)
- {
- while(isbusyUart5==true)
- {
- delay_ms(50);
- }
- isbusyUart5=true;
- u8 buffer[8] = {0};
- buffer[0] = slave_addr;
- buffer[1] = 0x03;
- buffer[2] = reg_addr>>8;
- buffer[3] = reg_addr&0xff;
- buffer[4] = len>>8;
- buffer[5] = len;
- u16 crcData = crc16(buffer,6);
- buffer[6] = crcData >> 8;
- buffer[7] = crcData & 0xff;
- USART5_Rx_Buffer.index = 0;
- for(int i=0;i<8;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[50] = {0};
- int recLen = 0;
- getUart5RecData(bufferRec,&recLen);
- if(recLen != (5 + 2*len))
- {
- isbusyUart5=false;
- return false;
- }
- if((bufferRec[0] == slave_addr)&&(bufferRec[1] == 0x03)&&(bufferRec[2] == len*2))
- {
- u8* dataAddr = &bufferRec[3];
- for(int i = 0;i<len;i++)
- {
- data[i] = (dataAddr[i*2]<< 8) + dataAddr[i*2 +1];
- }
- }
- else
- {
- isbusyUart5=false;
- return false;
- }
- isbusyUart5=false;
- return true;
- }
- u16 crc16(u8 *puchMsg, u16 usDataLen)
- {
- u8 uchCRCHi = 0xFF ;
- u8 uchCRCLo = 0xFF ;
- u32 uIndex = 0 ;
- if(usDataLen>255)
- retrun 0;
- while (usDataLen--)
- {
- uIndex = uchCRCHi ^ *puchMsg++ ;
- uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
- uchCRCLo = auchCRCLo[uIndex] ;
- }
- return (uchCRCHi << 8 | uchCRCLo) ;
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
要打在53行看两个形参的值,你在中断那里看到的并不是运行到CRC函数时的值,可能都运行完了这个函数,那个只是栈原先分配给的地址,已经被其它用了。进这个中断大多是数组越界写入或者栈越界了。
|