在对GPRS模块调试时,遇到了个问题, void ReadPhoneBook(void) { UART1_SendString("取消回显开始:\r\n"); Flag=0; Second_AT_Command("ATE0","OK",3); //取消回显 UART1_SendString(Uart2_Buf); //把模块返回的信息原样输出 UART1_SendString("取消回显结束:\r\n"); HAL_Delay(2000); UART1_SendString("读取电话号码开始:\r\n"); Flag=1; Second_AT_Command("AT+CPBR=1,2","OK",3); UART1_SendString(Uart2_Buf); //把模块返回的信息原样输出 UART1_SendString("读取电话号码结束:\r\n"); } 上面的紫色部分不要的话,在正常通讯3,4次后,就一定会掉进void HardFault_Handler(void)里。要的话,就一点问题都没有。 我这里在对程序的关键点注释一下: 因为对于紫色部分的Second_AT_Command("ATE0","OK",3); GPRS模块应答 就只回OK,只有一行。而对于Second_AT_Command("AT+CPBR=1,2","OK",3);则会应答2行以上的信息。所以在下的红字体做了区分。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart) { static char i; UNUSED(huart); if(huart==&huart1) { } else if(huart==&huart2) { //不定长接收 Uart2_Buf[i++] = uart2_RXdata; //接收不定长数据(其实是每次只接收一个字节),直到遇到\n,才进行处理。或者长度大于缓存数组的长度 if(i >= Buf2_Max || Uart2_Buf[i-1]== '\n') { /*接收完一串数据后进行处理*/ RXend_usart2 =SET; if(!Flag) i=0; } } } 关于,对于上面的2条指令,GPRS模块所反馈应答的内容,可以参看《PC通过串口调试助手模拟》图 , 另外MCU调试得截图也附上 |
STM32F107+LWIP---如何检查tcp通讯断开?并重新连接
有没有用过数字式mems麦克风的,想问下SPI通讯的问题
stm32f103 CAN通讯多帧发送问题?
STM32F107作为USB主机模拟串口通讯不成功(采用PL2303芯片)
STM32F103C8 LIN通讯例程
求助,丐版J-Link通讯不上
ethernet可以与ethercat通讯吗?
LIS3DH SPI 通讯问题
STM32F373 CAN通讯问题CAN_FLAG_LEC
请教高手看看,STM32F1的多机通讯,地址匹配唤醒问题
评分
查看全部评分
hardfault一般不是硬件问题引起,一般是内存溢出、越界、野指针等引起。他这个问题,很可能就是数组越界
if(i >= Buf2_Max || Uart2_Buf[i-1]== '\n')
这个指令中应该是i>Buf2_Max 如果等于的话已经是越界了
比如buf[8]这个数组 只能存8个数 但是i>=8的时候是存了9个数,i>8是存了8个数 编程时需要注意一下
评分
查看全部评分
你说的对 我支持你
楼主应注意这点,如何确保 UART1_SendString(Uart2_Buf) 时,Uart2_Buf 不空
评分
查看全部评分
评分
查看全部评分
如果用 MDK调试的话注意关注CALL STACK里面能看出在调用那个函数挂的
仔细查就是了
评分
查看全部评分