Python设备和C语言设备通信(使用openmv、单片机、树莓派、K210等等设备的通信)

2023-11-11

前言

通信无疑是做项目最常用到的一部分内容,如Openmv、K210、树莓派等经常需要将其检测到的目标物体的坐标发送给单片机去处理,本文将记录几种最常见、最基础的通信方法。

数据类型和编码格式

数据类型
通信前,我们得先对各个数据类型有基础的了解。其中单片机常见的无非是u8/u16/int/float/char/str。通信的时候一定要注意char和str的区别,如’s’是char类型,但“s”确实str类型。两者的区别不止在于单引号和双引号,还有str类型会多出一个’/0’作为结束标志位,所以同样是发一个s,“s”会比‘s’多出一个字节。
编码格式
编码格式种类就很多了,但是单片机常用的无非是我们熟悉的ascll码格式,而python则是"uft-8"。两种当然有所区别,但是对于数字、英文的通信,我们可将其视为无区别。

发送单个字符

一、python端发,单片机接收

usart.write('s')       #python直接发
u8 temp;      //stm32每次只能接收八位,刚好一个字符
temp=USART_ReceiveData(USART1);  //stm32直接接收

二、单片机发,python端收

USART_SendData(USART1,'s')   //直接发
recieve=usart.read().decode("utf-8") #接收需要解码为“utf-8"格式

发送单个整形

一、将int拆分成4个u8类型的数据

int temp;        #定义一个整形变量
unsigned char rec[4],i;
for(i=0;i<4;i++)
{
	rec[i]=temp>>(i*8);
}

二、python端发,单片机接收

send1=5         
send2=bytearray(rec[0],rec[1],rec[2],rec[3])
usart.write(send2)

字节数组顾名思义,每一个变量只有一个字节,而int拥有四个字节,所以得拆开来发。
三、单片机端接收

int temp;
for(i=0;i<4;i++)
{
	temp=USART_ReceiveData(USART1);   //这里以USART1为例
	temp<<=(i*8);
}

由于串口每次也只能收一个字节,所以我们不妨连续接收四次,然后通过移位又重新组合成一个int型。**但,现实不建议这样操作,有加上帧头标识符和帧尾标识符才能够确保收到数据的准确率。**后面我会讲更好的办法,这里只是提供一个理论思路而已。
int的发送的时候会被压缩成u8类型,所以如果你发的数据在0~255之间,其实直接发和直接收就可以了,不必搞的如此麻烦。

发送字符+数字

一、python端发,单片机接收

int temp;        #定义一个整形变量
unsigned char rec[4],i;
for(i=0;i<4;i++)
{
	rec[i]=temp>>(i*8);
}  
send2=bytearray(0x99,'a',rec[0],rec[1],rec[2],rec[3],'b') #发送了0x99,'a',5,'b'
usart.write(send2)

有了字节数组,你要发多少,发什么类型都不在话下。为了使数据能够准确的传输,这里用了0x99做为帧头,帧头帧尾各位自行发挥。

u8 temp[7];    //接收所有字节
int num;          //存储接收的整形

temp[0]==USART_ReceiveData(USART1);
if(temp[0]==0x99)  //判断帧头
{
	for(i=1;i<=6;i++)
	{
		temp[i]=USART_ReceiveData(USART1);
	}
}
for(i=2;i<=5;i++)   //字节数组中的第二个到第五个字节是属于int的
{
	num=temp[i];
	num<<=(i*8);
}

总结

相信看到这里,你们依旧没办法直接把我代码copy过去。但我已经提供了一个发送接收的思路了,具体如何用,需要各位加以理解后再发挥你们的智慧了。

避坑

1、python字符、字符串只能用decode(解码),不能用encode编码。decode(“utf-8”)意为将其他编码格式(如ascll)发送过来的字符、字符串转化为python看得懂的"utf-8"格式。
如果还一知半解,可以去了解一下编码格式,和数据类型的区别。
2、串口的发送永远一次只能发一个字节,所以无论是你打包一起发,还是一个一个发,效果都是一样的。
3、int压缩成u8的时候,只取低八位,所以int转化成u8的时候,用要右移。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python设备和C语言设备通信(使用openmv、单片机、树莓派、K210等等设备的通信) 的相关文章

随机推荐

  • Android绘制虚线

    Android绘制虚线的两种方式 1 自定义view 看到网上很多人说用drawLine绘制 但是其实根本就没有效果 真正效果的是drawPath这个方法 话不多说直接上代码 public class DotView extends Vie
  • 【云原生之Docker实战】使用docker部署mkdocs项目文档工具

    云原生之Docker实战 使用docker部署mkdocs项目文档工具 一 mkdocs介绍 1 mkdocs简介 2 mkdocs特点 二 检查本地环境 1 检查docker版本 2 检查docker状态 3 检查系统版本 三 下载mkd
  • VUE 开发使用的一些表格框架

    Vue 开发中使用的框架 表格 1 http www quasarchs com 2 https vxetable cn table start install
  • Spring Boot 实现 WebSocket 示例

    什么是 WebSocket WebSocket协议提供了一种标准化的方法 通过单个TCP连接在客户机和服务器之间建立全双工 双向的通信通道 它是一种不同于HTTP的TCP协议 但被设计为在HTTP上工作 使用端口80和443 并允许重用现有
  • 电量优化与网络优化

    一 Doze低电耗模式 未充电 屏幕熄灭 让设备在一段时间内保持不活动状态 延迟应用的后台 CPU 和网络活动 从而降低耗电量 二 Standby待机模式 应用待机模式会延迟用户近期未与之交互的应用的后台网络活动 三 白名单 系统提供了一个
  • JS工具库之正则规则校验

    1 内置了一些校验规则 如是否手机号 邮箱号 URL等 这些规则方法 写在test js下面 如验证是否手机号 test mobile 13888889999 如果验证通过 返回true 否则返回false 例子1 是否验证码 校验是否验证
  • 信息熵到底是什么

    信息是我们一直在谈论的东西 但信息这个概念本身依然比较抽象 在百度百科中的定义 信息 泛指人类社会传播的一切内容 指音讯 消息 通信系统传输和处理的对象 但信息可不可以被量化 怎样量化 答案当然是有的 那就是 信息熵 早在1948年 香农
  • ubantu环境下IDA pro运行时碰到某些so找不到的问题

    最近帮组员解决IDA的问题 做个记录 问题 执行启动idea时出现报错 IDA Pro idaq64 报错如下 idaq64 error while loading shared libraries libgthread 2 0 so 0
  • 基于opencv中HOG+SVM的车轮识别及predict()函数的改进

    前言 opencv中HOG SVM已经是一个相对成熟的环境 只是在满足兼容性的条件下会牺牲很大的时间开销 在训练部分未做改进 只是对detectMultiScale 中的predict进行改进 其中HOG特征计算请参考 http blog
  • Oracle恢复删除的数据

    不下心删除了生产库的数据或者不小心删除了一部分数据 如何恢复找回 Oracle恢复删除数据的方法 方案一 利用oracle提供的闪回方法进行数据恢复 适用于delete删除方式 首先获取删除数据的时间点 select from v sql
  • C++_模板函数

    参考以下大佬博客 参考1 参考2 参考3 参考4 参考5 我们为什么需要模板 同样的函数 我们要为不同的参数类型写不同的版本 程序的逻辑是一模一样的 只是他们的类型是不一样的 如下 void Swap int x int y int tmp
  • ARM嵌入式体系架构(理论篇)

    基础知识 1 电路中的逻辑状态 0代表的是低电平 1代表高电平 2 半导体元开关 1 二极管 单向导通性 普通二极管 发光二极管 光敏二极管 稳压二极管 2 三极管 开关特性 C 集电集 B 基集 E 发射集 PNP型 电流方向从E极流向C
  • keil报错:No Target connected+Error: Flash Download failed - Target DLL has been cancelled四种可能

    一 供电 板子一定要供电 二 ST LINK是否接触不良 确保ST LINK跟板子连接完好 三 按住reset点击download 硬件和接线都没问题情况下 这时候可能是SWD的引脚被占用了 或者被禁用了 这时候ST LINK自然无法通过S
  • MySQL01

    课程回顾 数据库相关sql 查询所有 show databases 创建 create database db1 charset utf8 gbk 查看数据库信息 show create database db1 删除数据库 drop da
  • 使用Navicat插入数据时报错1062 - Duplicate entry ‘menu544073941‘ for key ‘PRIMARY‘

    gt 报错 1062 Duplicate entry menu544073941 for key PRIMARY gt 原因 数据库表在设计时 没有设置id主键自增 而要插入的这条数据id在表中已经存在 存在冲突 gt 解决 lt 2种 g
  • 常见的测试用例设计方法7---因果图法

    目录 一 因果图法的定义 二 因果图法的意义 三 因果图法的适用场合 四 因果图法的表示 五 因果图法的四种关系 六 因果图的基本约束 七 因果图的分析步骤及案例 一 因果图法的定义 因果图法是一种利用图解法分析输入的各种组合情况 从而设计
  • Understand Spring Security Architecture and implement Spring Boot Security

    In this tutorial we will be looking at how Spring Security works and its architecture We will be creating a Spring Boot
  • 谷歌浏览器设置黑暗模式

    方法一 在chrome的实验性功能中开启黑暗模式 1 打开Google Chrome 在地址栏中输入 chrome flags 回车 进入实验性功能页面 2 在搜索框中搜索 Auto Dark Mode for Web Contents 3
  • linux audit原理,Wauzh原理简析及audit规则风险评估

    HIDS基本原理 熟悉HIDS的朋友应该了解 服务器的shell监控一般有两种 一种依靠Linux的audit审计功能 比如Wazuh 一种是重编译和替换bash二进制文件 将shell上执行的命令实时通过socket传递到服务端 前一种方
  • Python设备和C语言设备通信(使用openmv、单片机、树莓派、K210等等设备的通信)

    文章目录 前言 数据类型和编码格式 发送单个字符 发送单个整形 发送字符 数字 总结 避坑 前言 通信无疑是做项目最常用到的一部分内容 如Openmv K210 树莓派等经常需要将其检测到的目标物体的坐标发送给单片机去处理 本文将记录几种最