OpenMV与STM32串口通信 (OpenMV、K210、视觉模块 与 STM32单片机、51单片机串口通信,Python与C语言串口通信)

news2025/1/12 18:52:59

文章目录

  • Python端编码
  • 单片机端解码
  • 完整代码

2023/08/18

Python端编码

在Python端,我们想通过串口发送整型或浮点型数据时,可以借助struct.pack对需要发送的数据进行打包,简单来说,当调用这个函数时,设备会将需要发送的信息的底层数据直接通过串口发送。

举个例子,假设我们需要发送 字母A 字母B int型数据 float数据,如下图所示:
在这里插入图片描述

我们通过计算工具可以计算得到 123456 与 1234.56 在内存中的底层数据,如下图:
在这里插入图片描述

此时理论上我们需要发送的数据可表示为如下的字节流:
在这里插入图片描述

但需要注意的是,计算机在存储数据时,通常是以低位开始存储的,因此我们需要将int与float型数据转变为从小端开始,如下图:
在这里插入图片描述

此时,我们可以在STM32中创建一个10位的数组receive_data[10],将串口接收到的数据存储在该数组中,进入debug模式,等待接收完成,此时可以看到,串口接收到的数据与上图中我们推导的理论数据完全一致。
在这里插入图片描述

单片机端解码

既然数据已经成功发送到了单片机,那么我们对数据进行解析就非常简单了。

首先,我们定义四个变量 分别用来存储 A B int float,如下图:
在这里插入图片描述

由于我们已经知道receive_data[10]数组中的一二位对应字符,因此可以直接使用 = 获取到八位的字符型:
在这里插入图片描述

对于int型和float型,我们可以借助C语言中的memcpy,如下:
该函数即 从receive_data[2]开始,拷贝四个字节的数据到data_int处,而receive_data[2]receive_data[5]处存储的刚好为我们的int型数据。
在这里插入图片描述

float同理:
在这里插入图片描述

其实对于整型,我们除了使用上面的函数,也可以使用位移来实现,如下图:
这段代码位移完成后可以发现 data_int0x 00 01 E2 40 ,与上面实现的功能是一样的。
在这里插入图片描述

至此我们就完成了Python与C语言的串口通信,通过调试可以发现,数据与预期一致:
在这里插入图片描述

完整代码

Python发送端:

import time
from pyb import UART
from struct import pack

uart = UART(3, 115200)

while(True):

    # 1-2:AB  
    # 3-6:int型数据123456
    # 7-10:float型数据 1234.56

    #发送字符AB 每个占用一个字节 共占用两个字节
    data1 = bytearray([0x41,0x42]) 
    uart.write(data1)
    
    #发送整型数据int 占用四个字节
    data_int = 123456
    data2 = pack('i', data_int)
    uart.write(data2)
    
    #发送浮点型数据float 占用四个字节
    data_float = 1234.56
    data3 = pack('f', data_float)
    uart.write(data3)
    
    time.sleep(1)

STM32接收端:

// 定义接收数据
uint8_t receive_data[10] = {0};  //串口接收到的字节流

uint8_t data_char_1 = 0, data_char_2 = 0;  //A B
int32_t data_int = 0;  //整型数据
float data_float = 0;  //浮点型数据


//接收到10个字节流后触发中断进行处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart == &huart2)
  {
    data_char_1 = receive_data[0];  /* 第一字节数据 即A */
    data_char_2 = receive_data[1];  /* 第二字节数据 即B */
    
    /* 该四字节数据为int */
    /* 方法一 : 直接使用位移运算 */
    data_int = receive_data[5] << 24 | receive_data[4] << 16 | receive_data[3] << 8 | receive_data[2];
    /* 方法二 : 使用memcpy函数拷贝内存 */
    memcpy(&data_int, &receive_data[2], 4);
    
    /* 该四字节数据为 float */
    memcpy(&data_float, &receive_data[6], 4);
    
    HAL_UART_Receive_IT(&huart2, receive_data, 10);
  }
}

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

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

相关文章

java基础知识学习笔记

1、参考链接 Java 教程 | 菜鸟教程Java 教程 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。 本教程通过简单的实例将让大家更好的了解 Java 编程语言。 移动操…

微人事项目在线聊天(一)

项目首页增加聊天入口 添加一个消息按钮 Home.vue <el-header class"header"><h3 class"title">微人事</h3><div><el-button icon"el-icon-bell" type"text" style"margin-right: 8px;color: #0000…

centos如何查找某一命令对应的安装包

需求背景 有时候在容器里搭建了一个开发环境&#xff0c;需要有些命令能在容器里也能用&#xff0c;但是有时候只知道命令&#xff0c;但是不知道这个命令对应的是哪个安装包提供&#xff0c;比如最简单的命令 ip命令&#xff0c;"ip a"可以查看主机的所有ip信息&am…

Android应用架构-MVVM模式

前言 随着Android应用开发技术的不断发展和成熟&#xff0c;很开发者越来越关注着Android应用架构的设计。目前&#xff0c;Android的应用架构主要有MVC、MVP和MVVM模式&#xff0c;我们就来说一下MVVM模式。 MVP模式 MVVM模式可以说是MVP模式的进一步发展&#xff0c;所以先…

从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值

目录 1. 列表初始化initializer_list 2. 前面提到的一些知识点 2.1 小语法 2.2 STL中的一些变化 3. 右值和右值引用 3.1 右值和右值引用概念 3.2 右值引用类型的左值属性 3.3 左值引用与右值引用比较 3.4 右值引用的使用场景 3.4.1 左值引用的功能和短板 3.4.2 移动…

C语言 http协议

http协议是基于TCP协议之上的&#xff0c;所以首先得用TCP连接到指定服务器上&#xff0c;然后发送http请求。 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <stdio.h> #include…

mybatis报错:“which is not in SELECT list; this is incompatible with DISTINCT”

解决方案参考&#xff1a;https://blog.csdn.net/hyp187/article/details/102721830 总结就是版本问题导致&#xff1a; 使用参考链接中的方案一就解决了&#xff0c;主要是设置 session、global(当前有效&#xff0c;重启MySQL服务后失效&#xff0c;永久生效设置mysqld文件)…

记录一次arcgis engine开发版本引入问题

之前基于arcigs 10.1vs2013开发的程序&#xff0c;现在拿出来要改&#xff0c;但是目前版本是arcgis10.7vs2017/vs2019,打开后无论如何替换引用版本&#xff0c;都报错 &#xff08;具体版本对应可以看这&#xff1a;ArcGIS Engine 与 Visual Studio 版本对照表_vs2019对应啥版…

「UG/NX」Block UI 曲线收集器CurveCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

【Docker环境部署及基础命令操作】

CentOS7安装Docker&#xff08;使用yum安装&#xff09; 参考链接&#xff1a;https://developer.aliyun.com/mirror/docker-ce?spma2c6h.13651102.0.0.1ec41b11RJ4PKS #step 1:安装安装必要的一些系统工具 [rootnode1 ~]# yum install -y yum-utils device-mapper-persiste…

【仿写框架之仿写Tomact】一、Tomcat的工作流程

文章目录 1、启动阶段2、监听阶段&#xff1a;3、请求处理阶段&#xff1a;4、发送请求处理后的响应 当涉及到Java Web应用程序的部署和运行&#xff0c;Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器…

搭建UTMFW

UTMFW 是运行在 OpenBSD 上的 UTM 防火墙 github地址&#xff1a;https://github.com/sonertari/UTMFW 下载镜像&#xff1a; 按操作步骤搭建&#xff08;基本没有差别&#xff09;&#xff1a; Welcome to the OpenBSD/arm64 6.9 installation program. (I)nstall or (S)hell…

使用 PyTorch 进行高效图像分割:第 3 部分

一、说明 在这个由 4 部分组成的系列中&#xff0c;我们将使用 PyTorch 中的深度学习技术从头开始逐步实现图像分割。本部分将重点介绍如何使用深度可分离卷积来优化我们的 CNN 基线模型&#xff0c;以减少可训练参数的数量&#xff0c;使模型可部署在移动设备和其他边缘设备上…

阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)推送镜像全过程及总结

前提&#xff1a;安装配置好docker&#xff0c;可参考我这篇 基于CentOS7安装配置docker与docker-compose。 一、设置访问凭证 1.1 容器镜像服务ACR 登录进入阿里云首页&#xff0c;点击 产品-容器-容器镜像服务ACR 点击管理控制台 1.2 进入控制台-点击实例列表 个人容器…

numpy与matplotlib 常用日常代码

matplotlab 和 numpy 可能是python 数据处理工作中用的最多的库了&#xff0c; 官网的文档十分详细&#xff0c;但是就是因为数量庞大&#xff0c;很多时候常用的功能和生僻冷门的功能混在一起&#xff0c;找不到重点。按照二八原则&#xff0c;掌握20%的功能就已经能应付绝大多…

无法打开程序因为msvcp140.dll丢失,msvcp140.dll丢失的解决方法

前几天看到有小伙伴再问什么是msvcp140.dll文件&#xff0c;相信很多人都不知道这是什么吧&#xff0c;如果电脑msvcp140.dll文件丢失的话会怎么样呢&#xff1f;丢失了应该如何找回呢&#xff1f;其实这些都是一些比较常见的电脑知识&#xff0c;我们是需要去了解一下的&#…

Spring Framework中的Bean生命周期

目录 一.Bean生命周期的简介 1.基本概念 2.Spring生命周期的几大阶段 3.注意点及小结 4.生活案例 5.Spring容器管理JavaBean的初始化过程 二. Bean的单例选择与多例选择 1.单例选择与多例选择的优缺点 1.1单例模式的优点&#xff1a; 1.2单例模式的缺点&#xff1a; 1…

HC32L110的串口不定长接收及PCA和IRQ的部分问题

show you the code&#xff1a; https://gitee.com/yangfei_addoil/hc32-l110-b6-test 另&#xff1a;程序中使用帕斯卡命名法的是从官方例程上复制的&#xff1b;使用下划线命名法的是博主的&#xff1b; 串口不定长接收 注意串口要自己绑定/指定到一个定时器上&#xff1b…

【仿写tomcat】一、tomcat工作流程

仿写tomcat 简介tomcat简介流程分析tomcat是怎么和访问者交互的&#xff1f;流程图 简介 作者前不久刚仿写了一个简易的tomcat&#xff0c;在此分享给各位&#xff0c;此篇为对tomcat的简介和流程分析&#xff0c;具体仿写内容后续会贴在这里 扫描java文件&#xff0c;获取带…

基于IMX6ULLmini的Linux裸机开发系列六:中断向量表

ARMv7-A 一级查表 等中断真正发生的时候&#xff0c;自动跳转指定位置(基址偏移) 习惯放在代码的起始地方&#xff0c;复位中断放在代码的零地址&#xff0c;被定义的指定中断放在代码的第四个字节的位置 addrTYPEFUNCTIONMODE0x00Reset复位中断SVC0x04Undefined instructi…