串口接收并cjson解析后返回实现
This commit is contained in:
1 parent
1402105850
commit
43f2057b44
4 files changed
+73
-74
No files matched your search
@@ -13,7 +13,6 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "string.h"
|
||||
#include "data_comm.h"
|
||||
#include "language.h"
|
||||
#include "Variable.h"
|
||||
@@ -21,42 +20,8 @@
|
||||
|
||||
rt_mq_t proc_mq;
|
||||
|
||||
void proc_thread_entry(void *parameter)
|
||||
{
|
||||
struct proc_request *req;
|
||||
|
||||
while (1)
|
||||
{
|
||||
// 接收请求指针
|
||||
if (rt_mq_recv(proc_mq, &req, sizeof(req), RT_WAITING_FOREVER) == RT_EOK)
|
||||
{
|
||||
if (!req) continue;
|
||||
|
||||
rt_kprintf("Processing: %.*s\n", req->input_len, req->input);
|
||||
rt_kprintf("Processing: %d\n", req->input_len);
|
||||
rt_kprintf("Processing: %s\n", req->input);
|
||||
memcpy(DATA_api,req->input,5);
|
||||
//DATA_api[5]="\0";
|
||||
rt_kprintf("DATA_api: %s\n", DATA_api);
|
||||
extract_between(req->input, "[", "]", machine_ID, sizeof(machine_ID));
|
||||
rt_kprintf("machine_ID: %s\n", machine_ID);
|
||||
// 示例处理:回显
|
||||
req->output_len = rt_snprintf(req->output, sizeof(req->output),
|
||||
"Echo: %.*s", req->input_len, req->input);
|
||||
|
||||
// 通知 UART 线程可以发送了
|
||||
if (req->sem)
|
||||
{
|
||||
rt_sem_release(req->sem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 变量
|
||||
char cjson_falg=0;//是否解析cjson
|
||||
char *json_buffer=NULL;
|
||||
uint8_t cjson_falg=0;//是否解析cjson
|
||||
|
||||
/**
|
||||
* 截取两个指定子串之间的内容
|
||||
* @param src 源字符串
|
||||
@@ -85,7 +50,6 @@ int extract_between(const char *src, const char *start, const char *end, char *b
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 提取字符串并安全拷贝
|
||||
#define GET_STRING(dst, obj, key, size) do { \
|
||||
cJSON* _item = cJSON_GetObjectItem(obj, key); \
|
||||
@@ -94,50 +58,50 @@ int extract_between(const char *src, const char *start, const char *end, char *b
|
||||
(dst)[(size) - 1] = '\0'; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
// 提取浮点数
|
||||
#define GET_FLOAT_VAR(var, obj, key, default_val) do { \
|
||||
cJSON* _item = cJSON_GetObjectItem(obj, key); \
|
||||
(var) = cJSON_IsNumber(_item) ? (float)_item->valuedouble : (default_val); \
|
||||
} while(0)
|
||||
|
||||
// 提取整数(int 类型)
|
||||
#define GET_INT_VAR(var, obj, key, default_val) do { \
|
||||
cJSON* _item = cJSON_GetObjectItem(obj, key); \
|
||||
(var) = cJSON_IsNumber(_item) ? (int)_item->valueint : (default_val); \
|
||||
} while(0)
|
||||
|
||||
// ===== cJSON分析 =====
|
||||
// ===== cJSON分析 =====//
|
||||
void pasre_DAT(const char *api, const char *json_str)
|
||||
{
|
||||
|
||||
cJSON *root=cJSON_Parse(json_str);
|
||||
cJSON *dat=cJSON_CreateObject();
|
||||
|
||||
if(json_buffer){
|
||||
if(json_buffer)
|
||||
{
|
||||
free(json_buffer);
|
||||
json_buffer=NULL;
|
||||
}
|
||||
|
||||
if(strlen(json_str)>4){
|
||||
if(strlen(json_str)>4)
|
||||
{
|
||||
cjson_falg=1;
|
||||
//判断json解析是否成功
|
||||
if(!root)
|
||||
{
|
||||
printf("JSON parse error :%s\n",cJSON_GetErrorPtr());
|
||||
rt_kprintf("JSON parse error :%s\n",cJSON_GetErrorPtr());
|
||||
cJSON_Delete(root);
|
||||
// return "JSON parse error\n";
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(api, "SC800") == 0) {
|
||||
// 处理 SC800
|
||||
if (strcmp(api, "SC800") == 0)
|
||||
{// 处理 SC800
|
||||
cJSON_AddItemToObject(dat,"Name",cJSON_CreateString(machine_name));
|
||||
cJSON_AddItemToObject(dat,"Station",cJSON_CreateString(machine_ID));
|
||||
cJSON_AddItemToObject(dat,"SYSKEY",cJSON_CreateString(machine_ID));
|
||||
cJSON_AddItemToObject(dat,"Groups",cJSON_CreateString(machine_ID));
|
||||
}
|
||||
else if (strcmp(api, "SC810") == 0) {
|
||||
//工单明细
|
||||
else if (strcmp(api, "SC810") == 0)
|
||||
{//工单明细
|
||||
// === 解析整数变量 StepN ===
|
||||
GET_INT_VAR(StepN, root, "StepN", 0);
|
||||
// 字符串赋值
|
||||
@@ -168,8 +132,6 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
GET_FLOAT_VAR(P3S3, root, "P3S3", 0.0f);
|
||||
GET_FLOAT_VAR(P4S3, root, "P4S3", 0.0f);
|
||||
GET_FLOAT_VAR(P5S3, root, "P5S3", 0.0f);
|
||||
|
||||
|
||||
cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work));
|
||||
cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye));
|
||||
}
|
||||
@@ -215,7 +177,6 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
cJSON_AddItemToObject(dat,"RUN",cJSON_CreateNumber(RUN));
|
||||
cJSON_AddItemToObject(dat,"STEPID",cJSON_CreateNumber(STEPID));
|
||||
cJSON_AddItemToObject(dat,"CALL",cJSON_CreateBool(MACHINE_CALL));
|
||||
|
||||
cJSON_AddItemToObject(dat,"MST",cJSON_CreateNumber(MST));
|
||||
cJSON_AddItemToObject(dat,"MTT",cJSON_CreateNumber(MTT));
|
||||
cJSON_AddItemToObject(dat,"MTL",cJSON_CreateNumber(MTL));
|
||||
@@ -228,13 +189,13 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
cJSON_AddItemToObject(dat,"STTC",cJSON_CreateNumber(STTC));
|
||||
cJSON_AddItemToObject(dat,"STLC",cJSON_CreateNumber(STLC));
|
||||
}
|
||||
else if (strcmp(api, "SC831") == 0) {
|
||||
//当前步骤信息
|
||||
else if (strcmp(api, "SC831") == 0)
|
||||
{//当前步骤信息
|
||||
cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work));
|
||||
cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye));
|
||||
}
|
||||
else if (strcmp(api, "SC832") == 0) {
|
||||
//当前细节信息
|
||||
else if (strcmp(api, "SC832") == 0)
|
||||
{//当前细节信息
|
||||
cJSON_AddItemToObject(dat,"Pump",cJSON_CreateNumber(Pump));//泵
|
||||
cJSON_AddItemToObject(dat,"TC",cJSON_CreateNumber(TC));//温度比例
|
||||
cJSON_AddItemToObject(dat,"Fan",cJSON_CreateNumber(Fan));//风机
|
||||
@@ -244,15 +205,14 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
cJSON_AddItemToObject(dat,"STB",cJSON_CreateNumber(STB));//料2
|
||||
cJSON_AddItemToObject(dat,"STC",cJSON_CreateNumber(STC));//料3
|
||||
}
|
||||
else if (strcmp(api, "SC833") == 0) {
|
||||
//当前领料单信息
|
||||
else if (strcmp(api, "SC833") == 0)
|
||||
{//当前领料单信息
|
||||
cJSON_AddItemToObject(dat,"Work",cJSON_CreateString(Work));
|
||||
cJSON_AddItemToObject(dat,"ReDye",cJSON_CreateNumber(Redye));
|
||||
}
|
||||
else if (strcmp(api, "SC851") == 0) {
|
||||
//创建数组
|
||||
else if (strcmp(api, "SC851") == 0)
|
||||
{//创建数组
|
||||
cJSON *Dev = cJSON_CreateArray();
|
||||
//
|
||||
for (int i = 0; i < DIO_TABLE_SIZE; i++) {
|
||||
cJSON* item = cJSON_CreateObject();
|
||||
// 添加 IO 编号
|
||||
@@ -266,8 +226,8 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
}
|
||||
cJSON_AddItemToObject(dat,"DIO",Dev);
|
||||
}
|
||||
else if (strcmp(api, "SC852") == 0) {
|
||||
//创建数组
|
||||
else if (strcmp(api, "SC852") == 0)
|
||||
{//创建数组
|
||||
cJSON *Dev = cJSON_CreateArray();
|
||||
for (int i = 0; i < AIO_TABLE_SIZE; i++) {
|
||||
cJSON* item = cJSON_CreateObject();
|
||||
@@ -280,8 +240,8 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
}
|
||||
cJSON_AddItemToObject(dat,"A",Dev);
|
||||
}
|
||||
else if (strcmp(api, "SC853") == 0) {
|
||||
//创建数组
|
||||
else if (strcmp(api, "SC853") == 0)
|
||||
{//创建数组
|
||||
cJSON *Dev = cJSON_CreateArray();
|
||||
for (int i = 0; i < DATA_TABLE_SIZE; i++) {
|
||||
cJSON* item = cJSON_CreateObject();
|
||||
@@ -295,26 +255,65 @@ void pasre_DAT(const char *api, const char *json_str)
|
||||
cJSON_AddItemToObject(dat,"M",Dev);
|
||||
}
|
||||
else if (strcmp(api, "SC854") == 0) {
|
||||
|
||||
printf("Processing:SC854\n");
|
||||
|
||||
}
|
||||
else if (strcmp(api, "SC855") == 0) {
|
||||
printf("Processing:SC855\n");
|
||||
|
||||
}
|
||||
else if (strcmp(api, "SC859") == 0) {
|
||||
printf("Processing:SC859\n");
|
||||
|
||||
}
|
||||
else if (strcmp(api, "SC861") == 0) {
|
||||
printf("Processing:SC861\n");
|
||||
|
||||
}
|
||||
else if (strcmp(api, "SC862") == 0) {
|
||||
printf("Processing:SC862\n");
|
||||
|
||||
}
|
||||
else {}
|
||||
//printf(dat);
|
||||
else {
|
||||
memcpy(DATA_api,"SC999",5);
|
||||
}
|
||||
|
||||
json_buffer=cJSON_PrintUnformatted(dat);
|
||||
cJSON_Delete(root);
|
||||
cJSON_Delete(dat);
|
||||
// return json_buffer;
|
||||
}
|
||||
|
||||
void proc_thread_entry(void *parameter)
|
||||
{
|
||||
struct proc_request *req;
|
||||
while (1)
|
||||
{
|
||||
// 接收请求指针
|
||||
if (rt_mq_recv(proc_mq, &req, sizeof(req), RT_WAITING_FOREVER) == RT_EOK)
|
||||
{
|
||||
if (!req) continue;
|
||||
memcpy(DATA_api,req->input,5);
|
||||
extract_between(req->input, "[", "]", machine_ID, sizeof(machine_ID));
|
||||
char *p=strstr(req->input,"]");
|
||||
if(!p){cjson_falg=0;}
|
||||
else {
|
||||
p += strlen("]");
|
||||
}
|
||||
//处理指令分析
|
||||
pasre_DAT(DATA_api,p);
|
||||
// 回复
|
||||
int16_t total_len = strlen(machine_ID) + strlen(json_buffer) + 8;
|
||||
char t_buffer[total_len];
|
||||
snprintf(t_buffer,total_len,"%s[%s]%s",DATA_api,machine_ID,json_buffer);
|
||||
req->output_len = rt_snprintf(req->output, sizeof(req->output),t_buffer);
|
||||
// 通知 UART 线程可以发送了
|
||||
if (req->sem)
|
||||
{
|
||||
rt_sem_release(req->sem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int data_comm_init(void)
|
||||
@@ -327,7 +326,7 @@ int data_comm_init(void)
|
||||
}
|
||||
|
||||
rt_thread_t tid = rt_thread_create("data_comm", proc_thread_entry, RT_NULL,
|
||||
1024*16, 20, 10);
|
||||
1024*5, 20, 10);
|
||||
if (tid != RT_NULL)
|
||||
{
|
||||
rt_thread_startup(tid);
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
#define APPLICATIONS_DATA_COMM_H_
|
||||
|
||||
// 最大输入/输出长度
|
||||
#define MAX_INPUT_LEN 512
|
||||
#define MAX_OUTPUT_LEN 1024
|
||||
#define MAX_INPUT_LEN 1024
|
||||
#define MAX_OUTPUT_LEN 1024*3
|
||||
|
||||
// 请求结构体
|
||||
struct proc_request {
|
||||
|
||||
@@ -155,7 +155,7 @@ static int get_line(char *buf, int maxlen)
|
||||
int start_uart_thread(void)
|
||||
{
|
||||
rt_thread_t tid = rt_thread_create("data_uart", uart_thread_entry, RT_NULL,
|
||||
4096, // 栈大小:4KB
|
||||
1024*2, // 栈大小:3KB
|
||||
25, // 优先级
|
||||
10); // 时间片
|
||||
if (tid != RT_NULL)
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
// ===== 实际定义 =====
|
||||
|
||||
// 动态数据缓冲区(初始化为 NULL,后续分配)
|
||||
char *DATA_dat = NULL;
|
||||
char *DATA_machins = NULL;
|
||||
char *DATA_dat;
|
||||
char *DATA_machins;
|
||||
char DATA_api[5];
|
||||
char *machine_name = "Q109";
|
||||
char machine_ID[3] = "23";
|
||||
|
||||
Reference in new issue
Block a user