使用在C

问题描述

我在C语言中解析字符串时遇到问题。它最终导致HardFault

MCU:LPC1769, 操作系统:FreeRTOS 10, 工具链:IAR

为了进行测试,如果我继续发送相同的数据帧(您可能会在message函数的parseMessage变量中看到以下示例), 经过5到6次解析后,解析正常,解析按预期进行,然后在我向函数再发送一个完全相同的字符串时突然陷入HardFault

我在OnlineGDB中测试了该功能。我还没有发现任何问题。

尽管结果相同,但我在下面的函数中有几个稍微不同的版本;

char *substr3(char const *input,size_t start,size_t len) { 
    char *ret = malloc(len+1);
    memcpy(ret,input+start,len);
    ret[len]  = '\0';
    return ret;
}

为了更好地进行监控,我提取了功能块: (不必注意stripEOL(message);调用,它只是去除行尾字符,但是您可以在我的gdbonline份额中看到它)

void parseMessage(char * message){
        //char* message= "7E00002A347C31323030302D3132353330387C33302E30372E323032307C31317C33307C33317C31352D31367C31357C317C57656E67657274880D";
          
        // Parsing the frame
        char* start;
        char* len;
        char* cmd;
        char* data;
        char* chksum;
        char* end;
        
        stripEOL(message);
        unsigned int messagelen = strlen(message);
        
        start = substr3(message,2);
        len = substr3(message,2,4);
        cmd = substr3(message,6,2); 
        data = substr3(message,8,messagelen-8-4);
        chksum = substr3(message,messagelen-4,2);
        end = substr3(message,messagelen-2,2); 
}

只有data变量的长度不同。

例如数据->“ 347C31323030302D3132353330387C33302E30372E323032307C31317C33307C33317C31352D31367C31357C317C57656E67657274”

HardFault调试日志:

enter image description here

LR = 0x8667处于反汇编状态

enter image description here

PC = 0x2dd0反汇编

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)