板级调试小助手(4)基于C语言的自定义脚本解析器

一、前言

        在之前的文章中介绍了板级调试小助手的结构、DDS外设以及如何使用PYNQ驱动OLED显示视频,在小助手结构的文章中提到,小助手具有自定义脚本功能,这个功能是使用C语言编写的,本质上来说就是一个字典树通过读取脚本的关键词进行识别。在这篇文章中就给大家介绍一下一个简易的自定义脚本解析器吧。

        本项目代码完全开源,需要查看源码请移步《板级调试小助手(1)系统结构和原理》文章最后

二、脚本函数定义

在编写之前根据小助手项目自定义四个脚本如下

DO_OUT(A);	//数字量输出函数 A 是一个8bit十进制数,它的每一个bit代表一个DO,例如bit0代表DO0AO_OUT(A,B);	//它是模拟量输出函数,A表示通道数,B表示值范围为0~4096Delay(A);//它是延迟函数,A表示延迟时间,单位是毫秒SIN_OUT(A,B,C);//它是正弦波输出函数,A表示通道数,B表示频率值,C表示相位值

三、脚本解析流程和代码结构

        解析脚本的流程大致为:读取文件->读取一行代码->放入字典树识别关键词->通过关键词读取参数->将识别到的代码解析并放入链表(或二叉树)供其他应用调用。关于字典树和链表的知识这里就不赘述了。解析函数如下

//脚本相关的全局变量
SubLink SubLinkHand;		//命令链表表头
mytrie	TrieHand;			//字典树头
unsigned char g_cTrieDeep;	//记录字典树的最大深度
//定义脚本命令
char g_cCommand[10][10] = {"DO_OUT\0","AO_OUT\0","SIN_OUT\0","Delay\0"};/*
功能:脚本解析初始化
初始化命令链表
*/
void init_SubScript(void)
{if(SubLinkHand == NULL){SubLinkHand = (SubLink)malloc(sizeof(struct LNode));		//给脚本头申请内存SubLinkHand->cCommand = 0;SubLinkHand->Data = 0;SubLinkHand->Data1 = 0;SubLinkHand->Data2 = 0;SubLinkHand->Next = NULL;}
}/*
功能,读取脚本文件并解析脚本文件
将解析后的结果放入链表
*/
char Sub_main()
{FILE *file;static char cData[50];				//用于存放一行数据unsigned char cCommand;				//用于暂存命令unsigned int iCmd[3] = {0};			//用于暂存命令数据DelLink(SubLinkHand);							//清空整个脚本链表file = fopen("/home/xilinx/jupyter_notebooks/Overlay_Assistant/scriptApp/script.s","r");		//读取文件if (file == NULL)								//如果打开失败{printf("文件打开失败\r\n");return -1;}while(feof(file)==0)							//读取整个脚本文件{memset(cData, 0, 50);						//清空数组fgets(cData, sizeof(cData), file);			//读取一行数据cCommand = InquiryCommand(cData, iCmd);		//检测命令if (cCommand != 0xff){WriteLink(SubLinkHand, cCommand, iCmd);	//写入链表}}fclose(file);									//关闭文件return 0;
}

        解析完毕之后就可以通过读取链表的内容按照顺序执行脚本代码,执行代码如下

/*
功能:循环读执行取链表并下脚本(通过TCP通讯)
*/
void ReadScrip(SubLink Hand)
{FILE *file;SubLink q;			//定义一个可在链表中移动的指针char TcpTxBuff[100];	//发送缓存uint32_t ui32Delay;		//延迟时间uswhile(1){//脚本文件是否还存在file = fopen("/home/xilinx/jupyter_notebooks/Overlay_Assistant/scriptApp/script.s","r");		//读取文件if(file == NULL){break;}fclose(file); 									// 关闭文件//执行一遍脚本for(q=Hand;q->Next != NULL;q = q->Next){switch(q->Next->cCommand)		//选择指令{case COMMAND_DO:				//DO指令memset(TcpTxBuff,0x00,100);	//清除缓存sprintf(TcpTxBuff,"{\"mode\":\"set\",\"DO\":\"%d\"}",q->Next->Data);	//转义名称write(g_iTcpSock, TcpTxBuff, strlen(TcpTxBuff));						//通过网络发送break;case COMMAND_AO:				//AO指令strlenmemset(TcpTxBuff,0x00,100);	//清除缓存sprintf(TcpTxBuff,"{\"mode\":\"set\",\"AO%d mode\":\"1\",\"AO%d phase\":\"%d\"}",q->Next->Data,q->Next->Data,q->Next->Data1);remove_spaces(TcpTxBuff);			//删除字符串中的空格write(g_iTcpSock, TcpTxBuff, strlen(TcpTxBuff));						//通过网络发送break;case COMMAND_DDS:				//DDS指令memset(TcpTxBuff,0x00,100);	//清除缓存sprintf(TcpTxBuff,"{\"mode\":\"set\",\"AO%d mode\":\"2\",\"AO%d fre\":\"%d\",\"AO%d phase\":\"%d\"}",q->Next->Data,q->Next->Data,q->Next->Data1,q->Next->Data,q->Next->Data2);remove_spaces(TcpTxBuff);			//删除字符串中的空格write(g_iTcpSock, TcpTxBuff, strlen(TcpTxBuff));						//通过网络发送break;case COMMAND_Delay:				//清屏指令memset(TcpTxBuff,0x00,100);	//清除缓存ui32Delay = (uint32_t)q->Next->Data * 1000;usleep(ui32Delay);break;}usleep(100);}}
}

        该代码是通过读取链表的数据,将指令通过TCP发送给另一个应用(小助手主要逻辑应用)。

四、总结

        综上介绍了如何使用字典树的方式简单的搭建了一个识别自定义脚本程序,本人学识有限若有疏漏欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Laravel表单验证的艺术:精细控制数据的入口

Laravel表单验证的艺术:精细控制数据的入口 在Web应用开发中,表单请求验证是确保接收到的数据满足特定条件的重要环节。Laravel框架提供了一套强大且易于使用的验证系统,允许开发者定义复杂的验证规则并轻松地应用到表单请求上。本文将深入探…

Go 语言中的互斥锁 Mutex

Mutex 是一种互斥锁,名称来自 mutual exclusion,是一种用于控制多线程对共享资源的竞争访问的同步机制。在有的编程语言中,也将其称为锁(lock)。当一个线程获取互斥锁时,它将阻止其他线程对该资源的访问,直到该线程释放锁。这可以防止多个线程对共享资源进行冲突访问,从而…

FPGA实训报告DAY 1(Verilog HDL)

实习日志与总结 日期:2024 年 7 月 10 日 星期三 姓名:XXX 一、实习日志 上午 9:00 - 9:30 按时到达工位,参加部门早会,了解了今天的实习任务和目标,即初步学习 FPGA 简介和 Verilog 基础语法知识。 9:30 - 10:30…

LeetCode-随机链表的复制

. - 力扣(LeetCode) 本题思路: 首先注意到随机链表含有random的指针,这个random指针指向是随机的;先一个一个节点的拷贝,并且把拷贝的节点放在拷贝对象的后面,再让拷贝节点的next指向原链表拷贝…

免分助手神器-交管12123学法减分模拟考试题目及答案 #经验分享#其他

“驾照学法减分”为驾驶人提供了一种积极参与交通安全事业、减缓驾驶证扣分的方式,有益于促进驾驶人形成遵守交通规则、规范驾驶行为的良好习惯,提高道路交通安全意识和素养。然而,持有人仍需严格遵守道路交通安全法律法规,减少交…

1.MQ介绍

MQ 消息队列,本质是一个队列,先进先出,只不过队列中存放的内容是message而已。 为啥学习MQ 1.流量消峰 如果一个订单系统最多每秒能处理一万次订单,正常情况下我们下单1秒后就能返回结果。但是在高峰期,如果有两万…

服务端正常启动了,但是客户端请求不到

服务端正常启动了,但是客户端请求不到有哪些原因?如何排查? 如果客户端请求的接口没有响应,排查的方式: 检查接口IP地址是否正确,ping一下接口地址。 检查被测接口端口号是否正确,可以在本机Telnet接口的IP和端口号…

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1",选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机,比如我选择的是192.168.0.104: 结果提示:Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

splunk编写自定义命令

1. 自定义命令简介 splunk有丰富的内置搜索命令,但也提供了编写自定义命令来实现个性化的搜索需求,以此方式扩展splunk搜索处理语言(SPL)。 自定义搜索命令是一个可执行文件,可读入和写出数据,它可以是一…

状态机和工作流的选择

结论 如果你的需求主要集中在状态管理和状态转换控制,并且你使用的是Spring生态系统,Spring State Machine 是一个非常合适的选择。 如果你的需求是企业级的业务流程自动化,涉及到跨系统、跨组织的业务协调,并且需要强大的流程设计…

办公效率翻倍!2024最适合办公电脑安装的系统推荐!

当前,电脑已成为我们日常办公最常用的工具。为了确保高效顺畅的办公体验,选择一款合适的操作系统至关重要。那么,如何找到并下载最适合办公电脑的操作系统呢?接下来系统之家小编为您推荐2024年最适合办公电脑安装的系统&#xff0…

递推算法及解题套路

数学归纳法 step 1: 验证k0成立 step 2: 验证如果ki成立,那么ki1也成立 step 3: 联合step1与step2,证明由k0->kn成立 如何解决递推问题 1.确定递推状态 一个函数符号f(x),外加这个函数符号的含义描述 一般函数所对应的值,就是…

Qt窗口程序整理汇总

到今日为止,通过一个个案例的实验,逐步熟悉了 Qt6下 窗体界面开发的,将走过的路,再次汇总整理。 Qt Splash样式的登录窗https://blog.csdn.net/castlooo/article/details/140462768 Qt实现MDI应用程序https://blog.csdn.net/cast…

基于单片机STC89C52和GSM实现的远程拨号开锁设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于单片机STC89C52和GSM实现的远程拨号开锁设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘要 仿真图 单片机系统流程图 实物图 代码 系统论文 资源下载 摘要 本文介…

ArduPilot开源代码之AP_DAL_InertialSensor

ArduPilot开源代码之AP_DAL_InertialSensor 1. 源由2. 框架设计2.1 类定义和成员变量2.2 公共方法2.3 构造函数和其他方法2.4 私有成员变量 3. 重要例程3.1 InertialSensor-like 方法3.1.1 get_loop_rate_hz3.1.2 get_imu_pos_offset 3.2 accel 方法3.2.1 get_accel_count3.2.2…

无人机监测的必要性及方法

为什么需要无人机探测? 无人机的快速发展和广泛使用为各个行业带来了巨大好处,包括送货服务、农业和监控。然而,这种扩散也导致滥用现象增多,造成非法入侵空域、侵犯隐私和安全威胁。监控和探测在特定空域盘旋的无人机的能力变得…

Linux C++ 058-设计模式之解释器模式

Linux C 058-设计模式之解释器模式 本节关键字:Linux、C、设计模式、解释器模式 相关库函数: 概念 解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。 解释器模式用于构建一…

python数据可视化(9)——绘制小提琴图

课程学习来源:b站up:【蚂蚁学python】 【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接:【链接】】 python:3.12.3 所有库都使用最新版。 Python绘制小提琴图 小提琴图(violin plot…

理想主义者

我自认为不是一个理想主义者,可能更多的是一个实用主义者,做了这么多年的产品我更多的是关注产品的落地。但这并不妨碍我对理想主义者的敬重。 偏见只是偏见,微信之父张小龙的人生并不会被各种偏见左右。当所有人都在说张小龙迷茫时&#xf…

【经验总结】将markdown文档转换为word(swagger导出word)

工具准备: 任意markdown编辑器,以typora为例pandoc,官方下载地址 思路整理: 从swagger提取离线md文档将md文档转换为word格式 操作步骤: 一、安装pandoc (markdown编辑器安装略) 前往官网…