上位机图像处理和嵌入式模块部署(h750 mcu串口命令处理)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面学习103和407的时候,当时学过串口的收发。不过当时使用的主要是阻塞的方式。这一次,我们看下应该怎么利用中断的形式进行数据的收发。不仅如此,我们还可以看下,怎么把收到的数据放在一起,当成一个完整的命令去处理。
1、基本串口信息定义
这边的串口主要还是利用a9、a10来实现数据的收发,其中a9负责数据的发送,a10负责数据的接收。除此之外,数据是采用中断的形式进行处理的。
#define DEBUG_USART USART1
#define DEBUG_USART_CLK_ENABLE() __USART1_CLK_ENABLE();#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define DEBUG_USART_RX_PIN GPIO_PIN_10
#define DEBUG_USART_RX_AF GPIO_AF7_USART1#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define DEBUG_USART_TX_PIN GPIO_PIN_9
#define DEBUG_USART_TX_AF GPIO_AF7_USART1#define DEBUG_USART_IRQHandler USART1_IRQHandler
#define DEBUG_USART_IRQ USART1_IRQn
2、串口的初始化
串口的初始化这边基本上就是八股文,基本上按照套路下就可以了。一般就是配置时钟、配置gpio、配置uart、配置中断。对于我们来说,最重要的baudrate,也就是波特率,就是在这里配置的。
void DEBUG_USART_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;DEBUG_USART_RX_GPIO_CLK_ENABLE();DEBUG_USART_TX_GPIO_CLK_ENABLE();RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);DEBUG_USART_CLK_ENABLE();GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = DEBUG_USART_TX_AF;HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN;GPIO_InitStruct.Alternate = DEBUG_USART_RX_AF;HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStruct); UartHandle.Instance = DEBUG_USART;UartHandle.Init.BaudRate = 115200;UartHandle.Init.WordLength = UART_WORDLENGTH_8B;UartHandle.Init.StopBits = UART_STOPBITS_1;UartHandle.Init.Parity = UART_PARITY_NONE;UartHandle.Init.Mode = UART_MODE_TX_RX;UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;UartHandle.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;HAL_UART_Init(&UartHandle);HAL_NVIC_SetPriority(DEBUG_USART_IRQ, 0, 0);HAL_NVIC_EnableIRQ(DEBUG_USART_IRQ);__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE);
}
3、函数重定向
对于喜欢用getchar、printf进行数据收发的同学,一般还需要实现一下fputc、fgetc这两个函数。实现了这两个函数,后续就可以使用getchar和printf了。
void Usart_SendString(uint8_t *str)
{unsigned int k=0;do {HAL_UART_Transmit( &UartHandle,(uint8_t *)(str + k) ,1,1000);k++;} while(*(str + k)!='\0');}int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 1000); return (ch);
}int fgetc(FILE *f)
{ int ch;HAL_UART_Receive(&UartHandle, (uint8_t *)&ch, 1, 1000); return (ch);
}
4、中断处理
配置好了uart属性部分,下面就是中断处理。这里中断是一个数据、一个数据进行接收的,实际处理的时候,一般是进入中断之后循环接收数据,直到没有新的数据收到为止。
extern uint8_t Rxflag;
extern uint8_t ucTemp;void DEBUG_USART_IRQHandler(void)
{if(__HAL_UART_GET_IT( &UartHandle, UART_IT_RXNE ) != RESET){ Rxflag=1; HAL_UART_Receive(&UartHandle, (uint8_t *)&ucTemp, 1, 1000); }HAL_UART_IRQHandler(&UartHandle);
}
代码中Rxflag是标志位,ucTemp代表实际接收到的数据。
5、接收数据实际处理
单个接收到的数据一般是没有办法直接处理的,通常都是收集到一块来处理。处理结束的标志一般就是回车换行符,或者是某个特殊的标志也可以的。
while (1){if(Rxflag){if (usRxCount < sizeof(ucaRxBuf)){ucaRxBuf[usRxCount++] = ucTemp;}else{usRxCount = 0;}if (ucTemp == 0x0A) { HAL_UART_Transmit( &UartHandle, (uint8_t *)ucaRxBuf,usRxCount,1000 );usRxCount = 0;}Rxflag=0;__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_RXNE); }}
这边做的比较简单,整个while(1)部分是放在main函数里面的。如果Rxflag为1,那么把接收到的数据放到ucaRxBuf里面。接着检查数据是不是0x0a,也就是换行,如果是,就把数据发送回去。最后把Rxflag重新置0,打开串口接收中断,准备新的数据进来。
大家如果做的复杂一点,数据上面可以用queue的形式来处理,函数也可以抽象出来,实现部分做成parse command的形式,这样处理起来就会简单的多。另外,数据接收部分要尽快打开中断。
6、测试和验证
测试就比较简单了,直接把代码编译、下载后,利用ATK-XCOM上位机打开串口,输入123、abc这样的内容,看看有没有回显就知道代码对不对了。
相关文章:

上位机图像处理和嵌入式模块部署(h750 mcu串口命令处理)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面学习103和407的时候,当时学过串口的收发。不过当时使用的主要是阻塞的方式。这一次,我们看下应该怎么利用中断的形式进…...

西王食品2023营收下滑、净利润大幅减亏遭问询,近三年业绩承压
《港湾商业观察》廖紫雯 日前,西王食品股份有限公司(以下简称:西王食品,000639.SZ)收到来自深交所对公司2023年年报的问询函。 深交所问询函指出,要求公司说明营业收入下降、净利润大幅减亏的原因及合理性…...

视频媒介VS文字媒介
看到一篇蛮有思考意义的文章就摘录下来了,也引起了反思 目录 一、视频的定义 二、”视频媒介“与”文字媒介”作对比 1.形象 VS 抽象 2.被动 VS 主动 三、视频的缺点-【更少】的思考 1.看视频为啥会导致【更少的思考】 2.内容的【浅薄化】 3.内容的【娱乐化…...

虚拟化 之一 详解 jailhouse 架构及原理、软硬件要求、源码文件、基本组件
Jailhouse 是一个基于 Linux 实现的针对创建工业级应用程序的小型 Hypervisor,是由西门子公司的 Jan Kiszka 于 2013 年开发的,并得到了官方 Linux 内核的支持,在开源社区中获得了知名度和吸引力。 Jailhouse Jailhouse 是一种轻量级的虚拟化…...

汇凯金业:黄金期货交易时间规则
黄金期货交易时间规则因交易所不同而有所差异。以下是几个主要交易所的黄金期货交易时间及其相关规则: 一、纽约商品交易所(COMEX) 纽约商品交易所(COMEX)是全球最大的黄金期货交易市场之一,其黄金期货交易时间如下: 电子交易时间(通过CME…...

LogicFlow 学习笔记——4. LogicFlow 基础 边 Edge
边 Edge 和节点一样,LogicFlow 也内置一些基础的边。LogicFlow 的内置边包括: 直线 - line直角折现 - polyline贝塞尔曲线 - bezier 新建 src/views/Example/LogicFlow/Example08.vue 并编写如下代码: <script setup lang"ts&quo…...
QPS、TPS、并发量、PV、UV
QPS、TPS、并发量、PV、UV 目录 QPS、TPS、并发量、PV、UVQPS(Queries Per Second)TPS (Transactions Per Second)并发量 (Concurrency)PV (Page Views)UV (Unique Visitors) QPS(Queries Per Second) 含义:每秒查询率应用场景:常用于计算机中各类搜索引…...

深中通道通车在即,苏州金龙新V系穿梭巴士引领大湾区交通发展新篇章
深中通道,总投资500亿元,历时七年建成的世界级跨海工程,即将投入运营。该桥连接深圳、中山,全长24公里,通过“桥、岛、隧、水下互通”设计,克服地域障碍。桥面“穿梭巴士”同步启动,提供24小时跨…...

集成学习 #数据挖掘 #Python
集成学习是一种机器学习方法,它通过结合多个模型的预测结果来提高整体性能和稳定性。这种方法的主要思想是“集合智慧”,通过将多个模型(比如决策树、随机森林、梯度提升机等)的预测集成起来,可以减少单个模型的过拟合…...

IDEA 中设置 jdk 的版本
本文介绍一下 IDEA 中设置 jdk 版本的步骤。 一共有三处需要配置。 第一处 File --> Project Structure Project 和 Modules 下都需要指定一下。 第二处 File --> Settings 第三处 运行时的配置...

AI日报|Luma推出AI视频模型,又一Sora级选手登场?SD3 Medium发布,图中文效果改善明显
文章推荐 AI日报|仅三个月就下架?微软GPT Builder出局AI竞争赛;马斯克将撤回对奥特曼的诉讼 谁是最会写作文的AI“考生”?“阅卷老师”ChatGPT直呼惊艳! ⭐️搜索“可信AI进展“关注公众号,获取当日最新…...

嵌入式系统复习(一)
第一章 嵌入式系统的定义、特点 嵌入式系统是以应用为中心,以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 特点:嵌入性 专用性 计算机系统 嵌入式系统典型组成…...

一次搞定:Java中数组拷贝VS数组克隆
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…...

Java多线程编程与并发处理
引言 在现代编程中,多线程和并发处理是提高程序运行效率和资源利用率的重要方法。Java提供了丰富的多线程编程支持,包括线程的创建与生命周期管理、线程同步与锁机制、并发库和高级并发工具等。本文将详细介绍这些内容,并通过表格进行总结和…...

C++ 35 之 对象模型基础
#include <iostream> #include <string.h> using namespace std;class Students05{ public:// 只有非静态成员变量才算存储空间,其他都不算int s_a; // 非静态成员变量,算对象的存储空间double s_c;// 成员函数 不算对象的存储空间void f…...
PHP超级全局变量:功能、应用及最佳实践
PHP中的超级全局变量(Superglobal Variables)是预定义的数组,它们在脚本的全部作用域内都可以访问,无需使用global关键字。超级全局变量包含了关于请求、会话、服务器等各种信息,常见的有$_GET、$_POST、$_REQUEST、$_…...
python在windows创建的文件,换成linux系统格式
python在windows创建的文件,换成linux系统格式 dos2unix.exe的下载(下载的文件放入路径下:C:\Windows\System32) 链接:https://pan.baidu.com/s/10fC2tfvUtbh-axJ21cj_Xw?pwdm3zc 提取码:m3zc 批量修改文件格式 import subpr…...

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)
Conference:International Conference on Software Engineering (ICSE) CCF level:CCF A Categories:Software Engineering/System Software/Programming Languages Year:2024 Num:13 第1~7篇区块链文章请点击此处…...

C++ 34 之 单例模式
#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数,为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…...

SAP BW:传输转换源系统-源系统映射关系
最近有朋友再问问我源系统映射关系怎么配置,想着写一个怕以后忘了。 简单说下这个是干嘛的,其实就是配置一个源系统到目标系统的一个映射,这样传输的时候才知道传过来的数据源要变成目标系统的数据源。 比如下图,在开发环境&…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...