博客摘录「 六自由度机械臂运动学分析及其轨迹规划」2024年10月8日

间中进行轨迹规划是直接用运动时的受控变量规划轨迹,有着计算

objectivec 复制代码
#include <stdio.h>
#include <string.h>
#include <stdint.h>

// 模拟数据结构
typedef struct {
    uint8_t MonitorModbusAdd1[400]; // 30个命令 * 10字节 + 预留
} GenSetMonitorModbusAdd_t;

GenSetMonitorModbusAdd_t GenSetMonitorModbusAdd;

// 模拟函数原型
int GetstrLen(char* str, char delimiter);
int Get_Command_Val(char* src, uint8_t* dest, char delimiter, int* strPos, int* temp_num);

// 模拟测试主函数
void Simulate_Parse_Modbus_Commands()
{
    // 模拟输入数据(来自串口接收缓冲区)
    char RXBufferUsart4[] = "{\"device_id\":\"12345\",\"para_command\":\"01010000004EBC3E;01030000002D85D7;0103002E000AA5C4\",\"con_command\":\"01010000004EBC3E;01030000002D85D7;0103002E000AA5C4\",\"online_rate\":5000}";
    
    char commandStr[2000];
    char* pstr;
    int len, i, temp1;
    int strP = 0, temp_num = 0;
    uint8_t* val;
    int writeModbusAdd_en = 0;
    int countModbusMonitor = 0;
    
    printf("=== Modbus命令解析模拟测试 ===\n");
    printf("原始JSON数据:\n%s\n\n", RXBufferUsart4);
    
    // 1. 查找para_command字段
    pstr = strstr((char *)RXBufferUsart4, "para_command");
    if (NULL != pstr)
    {
        printf("1. 找到para_command字段,位置: %ld\n", pstr - RXBufferUsart4);
        
        // 2. 提取para_command字段值
        len = GetstrLen(pstr, ',');  // 获取到下一个逗号前的长度
        printf("2. para_command值长度: %d\n", len);
        
        memset(commandStr, 0, 2000);
        memcpy(commandStr, pstr + 15, len - 16);  // 跳过 "para_command":"
        printf("3. 提取的命令字符串: \"%s\"\n", commandStr);
        
        // 3. 清空Modbus地址存储区
        memset(&GenSetMonitorModbusAdd.MonitorModbusAdd1[0], 0, 400);
        strP = 0;  // 字符串解析位置指针
        
        printf("4. 开始解析Modbus命令...\n");
        
        // 4. 解析多个Modbus命令(最多30个)
        for (i = 0; i < 30; i++)
        {
            // 每个Modbus命令占用10字节的空间
            val = &GenSetMonitorModbusAdd.MonitorModbusAdd1[0] + 10 * i;
            
            printf("  命令[%d]存储位置: %p\n", i, (void*)val);
            
            // 解析单个Modbus命令
            temp1 = Get_Command_Val(commandStr + strP, val, ';', &strP, &temp_num);
            
            // 如果字符串结束,提前退出循环
            if (commandStr[strP] == '\0') {
                countModbusMonitor = i + 1;
                printf("  字符串结束,实际命令数: %d\n", countModbusMonitor);
                break;
            }
        }
        
        // 5. 设置写入标志
        writeModbusAdd_en = 1;  // 通知系统需要写入配置到存储
        printf("\n5. 解析完成,设置写入标志: writeModbusAdd_en = %d\n", writeModbusAdd_en);
        
        // 6. 显示解析结果
        printf("\n=== 解析结果详情 ===\n");
        printf("命令字符串: %s\n", commandStr);
        printf("实际解析命令数: %d\n", countModbusMonitor);
        printf("每个命令占用: 10字节\n");
        printf("总占用空间: %d字节\n", countModbusMonitor * 10);
        
        // 显示每个命令的存储内容
        printf("\n存储内容(十六进制):\n");
        for (i = 0; i < countModbusMonitor; i++) {
            printf("命令%d: ", i);
            for (int j = 0; j < 10; j++) {
                printf("%02X ", GenSetMonitorModbusAdd.MonitorModbusAdd1[i*10 + j]);
            }
            printf("\n");
        }
    }
    else
    {
        printf("未找到para_command字段\n");
    }
}

// 模拟实现GetstrLen函数
int GetstrLen(char* str, char delimiter)
{
    int len = 0;
    while (str[len] != delimiter && str[len] != '\0' && str[len] != '}') {
        len++;
    }
    return len;
}

// 模拟实现Get_Command_Val函数
int Get_Command_Val(char* src, uint8_t* dest, char delimiter, int* strPos, int* temp_num)
{
    char hexStr[13] = {0}; // 12字符 + null终止符
    int i = 0;
    
    printf("    解析命令: ");
    
    // 提取直到分隔符或字符串结束
    while (src[i] != delimiter && src[i] != '\0' && i < 12) {
        hexStr[i] = src[i];
        printf("%c", src[i]);
        i++;
    }
    
    printf(" (长度: %d)\n", i);
    
    if (i == 12) { // 标准Modbus RTU命令长度
        // 将十六进制字符串转换为字节
        for (int j = 0; j < 6; j++) {
            char hex[3] = {hexStr[j*2], hexStr[j*2+1], '\0'};
            dest[j] = (uint8_t)strtol(hex, NULL, 16);
        }
        
        // 剩余4字节填充0(预留)
        for (int j = 6; j < 10; j++) {
            dest[j] = 0;
        }
        
        *strPos += i;
        if (src[i] == delimiter) {
            (*strPos)++; // 跳过分号
        }
        
        return 1; // 成功
    }
    
    return 0; // 失败
}

int main()
{
    Simulate_Parse_Modbus_Commands();
    return 0;
}

相关推荐
锦瑟弦音6 小时前
微信小游戏分包(cocos自带分包)
笔记·游戏
找方案6 小时前
我的 all-in-rag 学习笔记:文本分块 ——RAG 系统的 “信息切菜术“
人工智能·笔记·all-in-rag
HXR_plume6 小时前
【Web信息处理与应用课程笔记1】网页排序(上)
笔记
qcwl667 小时前
操作系统 真象还原 学习笔记#13
笔记·学习
m0_689618287 小时前
30 分钟打印!多材料3D打印软机器人内置驱动 + 自主避障
笔记·学习·机器人
Rousson8 小时前
硬件学习笔记--93 静电防护方案(电阻、磁珠、电感、TVS等)
笔记·单片机·学习
思成不止于此8 小时前
【MySQL 零基础入门】事务精讲(二):ACID 特性与并发问题
数据库·笔记·学习·mysql
happyhappy没有句号9 小时前
嵌入式单片机一套通关学习笔记
笔记·单片机·嵌入式硬件·学习
悠哉悠哉愿意9 小时前
【嵌入式学习笔记】工程模板建立
笔记·嵌入式硬件·学习
d111111111d9 小时前
STM32外设基地址与寄存器偏移地址的深度解析
笔记·stm32·单片机·嵌入式硬件·学习