-
问题:cmd_prefix是判定为起始数据,cmd_suffix为结束数据,接收到cmd_suffix才会执行func 。 +IPD 数据没有固定的结束数据,所以当我收到 +IPD,3:123 时,并没有执行func,当下次收到 +IPD,3:456 时,才执行 +IPD,3:123 的func
-
解决方法:修改
get_urc_obj()
中对结束字符串的解析。默认结束字符串suffix_len == 0
时,接收到URC数据头会直接判定结束,在这里修改suffix_len == 0
时的处理,增加get_ipd_data_recv_end()判断IPD
数据是否接收完成。//buf: 去掉urc头后数据指针 //len: 去掉urc头后数据长度 //+IPD,3:123 static rt_uint8_t get_ipd_data_recv_end(char *buf, rt_uint16_t len) { rt_uint8_t res = 0; rt_uint16_t data_len = 0; if( 1 == sscanf(buf, "%d", &data_len) ){ rt_uint8_t index = 0; for(;(index < len) && (buf[index++] != ':');); if( (data_len + index) == len){ res = 1; // rt_kprintf("\r\n\r\nIPD data_len = %d; index = %d; len = %d\r\n\r\n", data_len, index, len); } } // else{ // rt_kprintf("\r\n\r\n[error] get IPD len fail\r\n\r\n"); // } return res; } static const struct at_urc *get_urc_obj(at_client_t client) { rt_size_t i, j, prefix_len, suffix_len; rt_size_t bufsz; char *buffer = RT_NULL; const struct at_urc *urc = RT_NULL; struct at_urc_table *urc_table = RT_NULL; if (client->urc_table == RT_NULL) { return RT_NULL; } buffer = client->recv_line_buf; bufsz = client->recv_line_len; for (i = 0; i < client->urc_table_size; i++) { for (j = 0; j < client->urc_table[i].urc_size; j++) { urc_table = client->urc_table + i; urc = urc_table->urc + j; prefix_len = rt_strlen(urc->cmd_prefix); suffix_len = rt_strlen(urc->cmd_suffix); if (bufsz < prefix_len + suffix_len) { continue; } if ((prefix_len ? !rt_strncmp(buffer, urc->cmd_prefix, prefix_len) : 1) // && (suffix_len ? !rt_strncmp(buffer + bufsz - suffix_len, urc->cmd_suffix, suffix_len) : 1)) && (suffix_len ? !rt_strncmp(buffer + bufsz - suffix_len, urc->cmd_suffix, suffix_len) : \ get_ipd_data_recv_end(buffer + prefix_len, bufsz - prefix_len))) { return urc; } } } return RT_NULL; }
RTT中AT指令对+IPD数据类没有结束符的数据处理问题
最新推荐文章于 2024-08-09 20:41:44 发布