上位机图像处理和嵌入式模块部署(mcu项目1:实现协议)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
这种mcu的嵌入式模块理论上都是私有协议,因为上位机和下位机都是自己开发的,所以只需要自己保证上、下位机可以通讯上,没有问题就行。但是现在有一个情况,那就是如何实现这个协议。现在我们是选择了ttl作为通信的方式,下面要做的就是如何用ttl实现通信协议。
1、上、下位机分开测试
前面准备好了通信的协议,各自就可以独立开发了。上位机可以用利用虚拟com进行测试,自己写一个假的下位机。而下位机呢,则可以通过串口工具来进行测试。一般来说,下位机如果测试没有问题了,才会去找上位机进行联合调试,不然调试的效率就太低了。
对于下位机来说,只要串口工具ok了,那么上位机不管是qt,还是mfc、c# wpf,只要按照协议把数据发下来,那就应该没问题的。
2、调试的时候一般都是通过16进制调试的
通常来说,发送的协议就是8位无符号数据,不是字符串。所以这个时候调试的时候,不管是接收命令,还是发送命令,最好都是通过16进制进行调试。

3、上位机一般是主动的那一方
通常来说,上位机都是主动的那一方。不管是去读数据,还是写数据,上位机都是主动发起请求的一方。这个时候,对于下位机来说,回复好上位机的问题,给出相应的答案就可以了。
4、压力测试是一定要的
协议解析的过程有可能出现不对的地方,这是很常见的。而且,随着开发的进行,有可能添加各种不同样的协议内容。所以不管哪一种协议,我们在实现和验证的时候,一定要进行压力测试,即通过串口工具周期性发送一些命令,这些都是可以的。单挑发送、多条发送、随机发送,一般的上位机工具都会支持这样的测试。
5、使用fsm去解析协议
串口的属性,决定了我们是一个、一个去接收数据的。这个时候就要求我们,需要根据这些单个的数据来判断它是否符合协议的要求。要做到这一点,最好的方法就是用有限状态机fsm去实现。比如说,首先是什么状态,接收到一个数据,应该是什么状态,是继续维持,还是说继续走向下一个状态。一般来说,只要状态机设计好,基本上固件都是非常稳定的。
void receiveUartData(void) // receive data and parse data here
{int index = 0;if (USART_ReadIntFlag(USART_UX, USART_INT_RXBNE) == SET){g_rx_buffer[0] = USART_RxData(USART_UX); /* receive one byte data*/switch(uartState){case HEAD_STATE1: // wait 0x55if(g_rx_buffer[0] == 0x55){g_usart_rx_buf[0] = g_rx_buffer[0];g_usart_rx_sta ++;uartState = HEAD_STATE2;}else{g_usart_rx_sta = 0;}break;case HEAD_STATE2: // wait another 0x55if(g_rx_buffer[0] == 0x55){g_usart_rx_buf[1] = g_rx_buffer[0];g_usart_rx_sta ++;uartState = TAIL_STATE1;}else{g_usart_rx_sta = 0;uartState = HEAD_STATE1;}break;case TAIL_STATE1: // wait 0xaaif(g_usart_rx_sta >= 32){g_usart_rx_sta = 0;uartState = HEAD_STATE1;break;}g_usart_rx_buf[g_usart_rx_sta] = g_rx_buffer[0];g_usart_rx_sta ++;if(g_rx_buffer[0] == 0xaa){uartState = TAIL_STATE2;}break;case TAIL_STATE2: // wait another 0xaag_usart_rx_buf[g_usart_rx_sta] = g_rx_buffer[0];g_usart_rx_sta ++;if(g_rx_buffer[0] == 0xaa && useFlag == 0) /* if useFlag = 0 or not qualified data, just drop it directly*/{for(index = 0; index < g_usart_rx_sta; index++){transferBuf[index] = g_usart_rx_buf[index];}bufLen = g_usart_rx_sta;useFlag = 1;}g_usart_rx_sta = 0;uartState = HEAD_STATE1;break;default:break;}USART_ClearIntFlag(USART_UX, USART_INT_RXBNE);}
}
6、协议的处理可以放到main里面继续进行
中断部分只是负责数据的接收,具体命令的解析可以放到main函数里面继续执行。毕竟接收数据本身是在中断函数处理的,这部分花的时间越少越好。而具体的数据解析,实时性没那么高,慢一点都是没有关系的。
extern uint16_t voltage; // add by feixiaoxing
int parseData() // use app tool to test the data
{unsigned char str[32] = {0};if(useFlag == 0){return -1;}if(0 == bufLen){setFlag();return -1;}if(bufLen < 4){setFlag();return -1;}if(transferBuf[0] != 0x55 || transferBuf[1] != 0x55){setFlag();return -1;}if(transferBuf[bufLen-2] != 0xaa || transferBuf[bufLen-1] != 0xaa){setFlag();return -1;}if(bufLen != 10) // header + length + commandid + crc + tail{setFlag();return -1;}// restore flagsetFlag();// prepare datastr[ 0] = 0x55; // headerstr[ 1] = 0x55;str[ 2] = 0x00; // lengthstr[ 3] = 0x08;str[ 4] = 0x00; // command id;str[ 5] = 0x00;str[ 6] = voltage / 1000; // datastr[ 7] = voltage % 1000;str[ 8] = 0x00; // crcstr[ 9] = 0x00;str[10] = 0xaa; // tailstr[11] = 0xaa;outputData((char*)str, 12);return 0;
}
相关文章:
上位机图像处理和嵌入式模块部署(mcu项目1:实现协议)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 这种mcu的嵌入式模块理论上都是私有协议,因为上位机和下位机都是自己开发的,所以只需要自己保证上、下位机可以通讯上&…...
【NLP学习笔记】load_dataset加载数据
除了常见的load_dataset(<hf上的dataset名>)这种方式加载HF上的所有数据外,还有其他custom的选项。 加载HF上部分数据 from datasets import load_dataset c4_subset load_dataset("allenai/c4", data_files"en/c4-train.0000*-of-01024.js…...
企业如何选择好用的供应商管理系统
供应商管理系统软件(SRM)是企业用于管理供应链中各个供应商关系的重要工具。现如今竞争激烈的市场环境下,选择一款合适的SRM软件显得尤为重要。那么,如何选择一款好用的供应商管理系统呢? 企业在选择好用的供应商管理…...
震惊!运气竟能如此放大!运气的惊人作用,你了解吗?
芒格:得到你想要的东西,最保险的办法,就是让自己配得上你想要的那个东西。今天仔细想了想这句话,他其实说的是无数成功人士的心声 —— “我配得上!” 美剧《绝命毒师》有个导演叫文斯吉里根(Vince Gilliga…...
记录一次Apache Tomcat 处理返回自定义的404页面
记录工作中遇到处理访问tomcat 不存在的资源,返回自定义的404页面 删除webapps目录下的example、docs、manager、hta-manager目录,只保留 ROOT目录,应用部署在了这个目录 删除 manager、hta-manager 我没有发现有什么异常 制作404.jsp 或者 4…...
【piania 的用法】
piania 的用法 定义store建议使用箭头函数TypeScript插件扩展1、全局添加对象 定义store import { ref, computed } from vue import { defineStore } from pinia // pinia 以函数的形式暴露出去 export const useCounterStore defineStore(counter, () > {// 1、ref 相当…...
上海计算机考研炸了,这所学校慎报!上海大学计算机考研考情分析!
上海大学(Shanghai University),简称“上大”,是上海市属、国家“211工程”重点建设的综合性大学,教育部与上海市人民政府共建高校,国防科技工业局与上海市人民政府共建高校,国家“双一流”世界…...
面对全球新能源汽车合作发展创维汽车如何实现共赢
由全球新能源汽车合作组织(筹)主办、中国电动汽车百人会承办的首届全球新能源汽车合作发展论坛(GNEV2024)于6月27日,6月28日在新加坡金沙会议展览中心召开。创维汽车国际营销公司总经理齐奎源受邀参会并作出分享。 本届大会以推动全球新能源汽车产业协同发展与合作…...
安全和加密常识(1)对称加密和非对称加密以及相应算法
文章目录 对称加密(Symmetric Encryption)非对称加密(Asymmetric Encryption)使用场景和优缺点对称加密和非对称加密是信息安全领域中两种重要的加密方式,它们分别使用不同的加密算法和密钥管理方式来保护数据的机密性。下面我来简单介绍一下它们及其相应的算法。 对称加…...
afrog-漏洞扫描(挖洞)工具【了解安装使用详细】
★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、afrog介绍 afrog 是一款性能卓越、快速稳定、PoC可定…...
c++类模板--无法解析的外部符号
解决办法 文章目录 解决办法方法1(推荐).在主函数包含头文件时将实现模板类的函数也包含进来方法2.将模板类的实现方法写在头文件里面方法3.函数模板声明前加inline 可能错误2,类内实现友元输出重载 方法1(推荐).在主函数包含头文件时将实现模板类的函数也包含进来 …...
Postman介绍
Postman 是一款流行的 API 开发和测试工具,它提供了一个直观的用户界面,使开发者可以轻松地构建、测试和修改 HTTP 请求。Postman 不仅适用于测试人员,也广泛应用于开发人员、产品经理和API设计者中,以确保API的正确性和性能。 以…...
以智能化为舵手,引领现代计算机系统架构新航向
编者按:如今计算机系统承载的服务和算法逻辑日益复杂,理解、设计并改进计算机系统已成为核心挑战。面对系统复杂度和规模的指数级增长,以及新的大模型驱动场景下的分布式系统形态的涌现,人们亟需创新方法与技术来应对。在计算机系…...
揭秘品牌成功秘诀:品牌营销策略的核心要素大公开
品牌营销作为企业战略中至关重要的一环,其核心是建立和传播品牌的独特魅力,使其在消费者心目中占据重要位置。 一个成功的品牌营销策略能够提升品牌的知名度和影响力,带来持续的销售和忠诚客户群体。 在当今竞争激烈的市场环境中࿰…...
java如何把list转换成map
不废话,直接上代码 public static void main(String[] args) {List<UserxVO> list new ArrayList<>();for (int i 0; i < 10; i) {list.add(new UserxVO("n" i, "dd" i));}Map<String, String> map list.stream().co…...
vite typescript 配置跨域代理
打开工程目录下vite.config.ts文件 export default defineConfig({plugins: [vue(), topLevelAwait()],resolve: { alias },server:{proxy:{/api:{ //对以 /api 开头的请求跨域处理target:http://xxx.xxx.cn,//目标服务器changeOrigin: true,rewrite:(path)>{return path.…...
ArcGIS Pro SDK (七)编辑 10 捕捉
ArcGIS Pro SDK (七)编辑 10 捕捉 文章目录 ArcGIS Pro SDK (七)编辑 10 捕捉1 配置捕捉 - 打开或关闭捕捉2 配置捕捉 - 应用程序捕捉模式3 配置捕捉 - 图层捕捉可捕捉性4 配置捕捉 - 图层捕捉模式5 配置捕捉 - 组合示例6 捕捉选项…...
开始尝试从0写一个项目--后端(一)
创建文件的目录结构 利用这个界面创建 序号 名称 说明 1 SEMS maven父工程,统一管理依赖版本,聚合其他子模块 2 sems-common 子模块,存放公共类,例如:工具类、常量类、异常类等 3 sems-pojo 子模块&#x…...
STM32第十二课:ADC检测烟雾浓度(MQ2)
文章目录 需求一、MQ-2 气体传感器特点应用电路及引脚 二、实现流程1.开时钟,分频,配IO2.配置ADC的工作模式3.配置通道4.复位,AD校准5.数值的获取 需求实现总结 需求 使用ADC将MQ2模块检测到的烟雾浓度模拟量转化为数字量。 最后,…...
1975react社区问答管理系统开发mysql数据库web结构node.js编程计算机网页源码
一、源码特点 react 社区问答管理系统是一套完善的完整信息管理类型系统,结合react.js框架和node.js后端完成本系统,对理解react node编程开发语言有帮助系统采用node框架(前后端分离)),系统具有完整的源…...
告别重复登录:D2RML如何革新暗黑2重制版多开体验
告别重复登录:D2RML如何革新暗黑2重制版多开体验 【免费下载链接】D2RML Diablo 2 Resurrected Multilauncher 项目地址: https://gitcode.com/gh_mirrors/d2/D2RML 作为暗黑破坏神2重制版的忠实玩家,你是否经历过这些令人沮丧的时刻?…...
事件驱动视觉革命:EVS技术如何重塑机器感知的未来格局
1. EVS技术:重新定义机器视觉的游戏规则 想象一下你正坐在高速行驶的列车上,窗外风景飞速掠过。传统相机就像每隔几秒才按下一次快门的游客,拍到的全是模糊不清的照片;而EVS(事件驱动视觉传感器)则像专业摄…...
GLM-4-9B-Chat-1M模型推理加速方案
GLM-4-9B-Chat-1M模型推理加速方案 1. 引言 如果你正在使用GLM-4-9B-Chat-1M这个支持百万级上下文的大模型,可能会发现推理速度有时候不太理想。特别是在处理长文本时,生成响应需要等待较长时间。这其实是很正常的现象,毕竟模型参数量达到9…...
Openclaw案例之构建《全自动化、高适配、可定制”的AI绘画生产体系》
⚡⚡⚡ 欢迎预览,批评指正⚡⚡⚡ 文章目录一、需求&目标二、搭建基础环境2.1 环境准备2.2 OpenClaw与绘画模型部署启动2.3 核心配置(模型插件联动)三、核心操作3.1 多智能体角色配置(核心步骤)3.2 一键启动自动化…...
示波器测量UART波特率的原理与实践
1. 示波器测量串口波特率的原理与方法 1.1 串口通信基础 在嵌入式系统开发中,UART串口通信是最常用的调试接口之一。正确识别串口波特率对于设备调试和逆向工程具有重要意义。串口通信采用异步传输方式,其关键参数包括: 波特率:…...
SDMatte高清人像抠图作品集:影视级海报与创意合成的幕后利器
SDMatte高清人像抠图作品集:影视级海报与创意合成的幕后利器 1. 开篇:当AI遇见专业级人像抠图 想象一下这样的场景:电影海报需要将主演从绿幕背景中完美剥离,电商广告要把模特无缝融入不同场景,艺术创作需要将人物与…...
JSON处理效率倍增:探索JSON Viewer的3个鲜为人知实用功能
JSON处理效率倍增:探索JSON Viewer的3个鲜为人知实用功能 【免费下载链接】json-viewer It is a Chrome extension for printing JSON and JSONP. 项目地址: https://gitcode.com/gh_mirrors/js/json-viewer 在数据驱动开发的时代,高效处理JSON数…...
大厂笔试面试八股文-算法-数组常考题-final
刷了200道数组题,笔试面试还是不会做?这10道搞懂就够了 刷了200道数组题,面试还是不会做? 问题不是你刷得不够多,而是没抓住核心套路。 我整理了35道大厂真题,发现其实就5个核心技巧。今天把最重要的10道题和背后的套路,全部分享给你。 offer直通车-大厂校招大礼包&#x…...
全球首届具身智能开发者大会深圳落幕,真机实战引领产业跃迁,重新定义具身智能新坐标
3月30日,由深圳市人工智能产业办公室指导,自变量机器人、深圳市人工智能行业协会与广东省具身智能训练场联合主办的全球首届具身智能开发者大会(Embodied AI Developers Conference,简称EAIDC 2026)暨「具亮计划」黑客…...
3分钟夺回你的数字音乐资产:Unlock Music浏览器解密全攻略 [特殊字符]
3分钟夺回你的数字音乐资产:Unlock Music浏览器解密全攻略 🎵 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web…...
