帮我实现一个stn32解析字符串的函数,字符串为不定长数据,如{cmd": "w","task_list" [{"id":1,"start":"2024-08-2318:56:00","flow_cmd":15.0,"angle":0,"duration":70000,"freq":5,"job':"HANJIE","position":"1234","factory":"JGF-001","sample":3}{"id":2,"start":"2024-03-0118:47:00","flow_cmd":8.5,"angle"0,"duration":30000,"freq":6,"job":"HanJie2","position":"1235","factory":"JGF-001","sample":4}]"cameraEnable":1."servoEnable":1."localTaskEnable": 1}
时间: 2025-05-01 14:34:59 浏览: 24
下面是一个基于STM32平台的简单实现思路,用于解析类似 JSON 格式的不定长字符串。由于 STM32 的资源有限(内存、处理能力等),我们通常需要手动解析这种格式,而不是依赖于完整的JSON库。
以下是示例代码及说明:
### 解析步骤
1. **提取字段**:从输入字符串中逐个查找关键字并获取对应的值。
2. **分割任务列表**:将 `task_list` 中的任务逐一分离,并分别解析出每个任务的内容。
3. **存储结果**:将解析到的数据存入结构体或其他形式以便后续使用。
---
#### 示例代码
```c
#include <stdio.h>
#include <string.h>
// 定义单个任务的结构体
typedef struct {
int id;
char start[20]; // 时间戳
float flow_cmd;
float angle;
unsigned long duration; // 持续时间 (ms)
int freq; // 频率
char job[20];
char position[20];
char factory[20];
int sample;
} Task;
// 主解析结构体
typedef struct {
char cmd[10]; // 命令
Task task_list[10]; // 最大支持10条任务
int task_count; // 当前任务数量
int cameraEnable; // 相机开关状态
int servoEnable; // 伺服开关状态
int localTaskEnable; // 局部任务启用标志
} ParsedData;
void parse_string(const char *input, ParsedData *parsed_data) {
const char *ptr = input;
parsed_data->task_count = 0;
while (*ptr != '\0') {
if (strstr(ptr, "\"cmd\":") == ptr) { // 提取cmd命令
ptr += strlen("\"cmd\":\"");
sscanf(ptr, "%[^\",]", parsed_data->cmd);
while (*ptr && *ptr != ',') ptr++;
} else if (strstr(ptr, "{\"id\":") == ptr) { // 开始解析一条新任务
if (parsed_data->task_count >= 10) break; // 超过最大任务数限制
Task *current_task = &parsed_data->task_list[parsed_data->task_count];
// ID 字段
ptr += strlen("{\"id\":");
current_task->id = strtol(ptr, NULL, 10); // 将数字转换为整型
while (*ptr && *ptr != '}') {
if (strstr(ptr, "\"start\":") == ptr) { // 提取开始时间
ptr += strlen("\"start\":\"");
sscanf(ptr, "%[^\",\"", current_task->start);
} else if (strstr(ptr, "\"flow_cmd\":") == ptr) { // 提取流量指令
ptr += strlen("\"flow_cmd\":");
current_task->flow_cmd = strtof(ptr, NULL); // 浮点数转换
} else if (strstr(ptr, "\"angle\":") == ptr) { // 提取角度
ptr += strlen("\"angle\":");
current_task->angle = strtof(ptr, NULL);
} else if (strstr(ptr, "\"duration\":") == ptr) { // 提取持续时间
ptr += strlen("\"duration\":");
current_task->duration = strtoul(ptr, NULL, 10); // 无符号长整形转换
} else if (strstr(ptr, "\"freq\":") == ptr) { // 提取频率
ptr += strlen("\"freq\":");
current_task->freq = strtol(ptr, NULL, 10);
} else if (strstr(ptr, "\"job\":") == ptr) { // 提取工作名称
ptr += strlen("\"job\":\"");
sscanf(ptr, "%[^\",\"", current_task->job);
} else if (strstr(ptr, "\"position\":") == ptr) { // 提取位置信息
ptr += strlen("\"position\":\"");
sscanf(ptr, "%[^\",\"", current_task->position);
} else if ( strstr(ptr, "\"factory\":") == ptr ) { // 提取工厂编号
ptr += strlen("\"factory\":\"");
sscanf( ptr ,"%[^\",\"" , current_task ->factory );
}
while(*ptr &&*ptr !=', '&&*ptr! ='{'&&!isspace(*ptr))ptr ++;}
}
// 更新任务计数
parsed_data->task_count++;
} else if(strstr(ptr,"\"cameraEnable\":")==ptr){
ptr+=strlen("\"cameraEnable\": ");
parsed_data->cameraEnable=strtol(ptr,NULL,10);
}else if(strstr(ptr,"\"servoEnable\":")==ptr){
ptr+=strlen("\"servoEnable\": ");
parsed_data->servoEnable=strtol(ptr,NULL,10 );
}else if(strstr(ptr,"\"localTaskEnable\":")==ptr ){
ptr+=strlen("\"localTaskEnable\": ");
parsed_data->localTaskEnable=strtol(ptr,NULL,10 );
}
while(*ptr&&*ptr!='}'&&!isspace(*ptr ))ptr++;}
}
// 测试主程序
int main() {
ParsedData data={ .task_count=0};
char test_str[]="{\"cmd\": \"w\",\"task_list\":[{\"id\":1,\"start\":\"2024-08-23T18:56:00\",\"flow_cmd\":15.0,\"angle\":0,\"duration\":70000,\"freq\":5,\"job\":\"HANJIE\",\"position\":\"1234\",\"factory\":\"JGF-001\",\"sample\":3},{\"id\":2,\"start\":\"2024-03-01T18:47:00\",\"flow_cmd\":8.5,\"angle\":0,\"duration\":30000,\"freq\":6,\"job\":\"HanJie2\",\"position\":\"1235\",\"factory\":\"JGF-001\",\"sample\":4}],\"cameraEnable\":1,\"servoEnable\":1,\"localTaskEnable\":1}";
parse_string(test_str,&data );
printf("Cmd:%s\n",data.cmd );
for(int i=0;i<data.task_count;i++){
printf("Task %d:\nID=%d\nStart Time=%s\nFlow Cmd=%.1f\nAngle=%.1f\nDuration=%lu ms\nFreq=%d\nJob=%s\nPosition=%s\nFactory=%s\nSample=%d\n",
i+1,data.task_list[i].id,
data.task_list[i].start,
data.task_list[i].flow_cmd,
data.task_list[i].angle,
data.task_list[i].duration,
data.task_list[i].freq,
data.task_list[i].job ,
data.task_list[i].position,
data.task_list[i].factory,
data.task_list[i].sample );}
return 0;}
```
---
###
阅读全文