单片机与Python串口通讯

ops/2024/12/22 16:02:44/

一、单片机

        串口是一条城乡之间的窄道(连接单片机和外设),一次只能并排走八个人(8位),但大部分城市(单片机)里的人(ADC数据)喜欢12个人并排走,所以只能分开传高八位、第八位。此处以ESP32的函数为例,假设有四个通道(其它单片机只要换一个串口发送函数即可):

      ptr_head = 0xAA; // 帧头ptr_end = 0xBB; // 帧尾for(i = 0; i < Sample_Num; i++){ptr1_H = (Voltage1[i] >> 8) & 0xFF; // 获取高八位ptr1_L = Voltage1[i] & 0xFF; // 获取低八位ptr2_H = (Voltage2[i] >> 8) & 0xFF;ptr2_L = Voltage2[i] & 0xFF;ptr3_H = (Voltage3[i] >> 8) & 0xFF;ptr3_L = Voltage3[i] & 0xFF;ptr4_H = (Voltage4[i] >> 8) & 0xFF;ptr4_L = Voltage4[i] & 0xFF;sprintf(ptr,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",ptr_head,ptr1_H,ptr1_L,ptr2_H,ptr2_L,ptr3_H,ptr3_L,ptr4_H,ptr4_L,ptr_end);Serial2.print(ptr);}

二、Python端

import serial
import pandas as pd
import matplotlib.pyplot as plt# 配置串口
com_port = 'COM11'  # 根据实际情况修改
baud = '57600'    # 根据实际情况修改
ser = serial.Serial(com_port, baud, timeout=1)  # 打开串口
print(f"{com_port}打开成功")  # 打印串口打开成功信息
Sample_Num = 512  # 采集的样本点数
count = 0# 初始化变量
voltage1 = []
voltage2 = []
voltage3 = []
voltage4 = []try:while len(voltage1) < Sample_Num:# 一次读一位if ser.in_waiting > 0:data = ser.read()# 检测帧头if data == b'\xAA':bytes_received = ser.read(9)  # 读取剩余的数据if bytes_received[-1] == 0xBB:# 解析数据ptr1_H, ptr1_L, ptr2_H, ptr2_L, ptr3_H, ptr3_L, ptr4_H, ptr4_L = bytes_received[:8]# 组装数据voltage1.append((ptr1_H << 8) | ptr1_L)voltage2.append((ptr2_H << 8) | ptr2_L)voltage3.append((ptr3_H << 8) | ptr3_L)voltage4.append((ptr4_H << 8) | ptr4_L)count = count + 1print(f"接收到{count}组数据")except KeyboardInterrupt:print("程序被用户中断")finally:ser.close()  # 关闭串口# 绘制图像,每个通道一个子图
fig, axs = plt.subplots(4, 1, figsize=(10, 8))  # 创建4个竖排的子图# 绘制每个通道
axs[0].plot(voltage1, label='Channel 1', color='blue')
axs[1].plot(voltage2, label='Channel 2', color='red')
axs[2].plot(voltage3, label='Channel 3', color='green')
axs[3].plot(voltage4, label='Channel 4', color='purple')# 设置每个子图的标签和标题
axs[0].set_title('Channel 1')
axs[1].set_title('Channel 2')
axs[2].set_title('Channel 3')
axs[3].set_title('Channel 4')# 设置x轴的标签
for ax in axs:ax.set_xlabel('Sample Number')# 设置y轴的标签
axs[0].set_ylabel('Voltage')
axs[1].set_ylabel('Voltage')
axs[2].set_ylabel('Voltage')
axs[3].set_ylabel('Voltage')# 显示图例
axs[0].legend()
axs[1].legend()
axs[2].legend()
axs[3].legend()# 调整子图间的间距
plt.tight_layout()
plt.show()

http://www.ppmy.cn/ops/28644.html

相关文章

【JavaEE网络】网络编程及其应用概述

目录 面向字节流粘包问题 TCP异常情况TCP/UDP对比 网络层重点协议IP协议IP地址 面向字节流 粘包问题 在面向字节流的情况下&#xff0c;会产生一些其他的问题&#xff1a;粘包问题&#xff0c;这里“粘”的是“应用层数据报”&#xff0c;通过TCP read/write的数据&#xff0…

解决:could not load library libcudnn_cnn_train.so.8

训练模型时报下面错误&#xff1a; could not load library libcudnn_cnn_train.so.8 出现错误的可能原因&#xff1a; PyTorch 有自己的 CUDA 依赖项&#xff08;包括 cuDNN&#xff09;&#xff0c;所以需要从库路径中移除本地安装的 cuDNN&#xff0c;让 PyTorch 加载它自…

消费品行业的5G新时代:2024年消费品行业趋势洞察报告

来源&#xff1a;安永 2023 年&#xff0c;我国社会消费品零售总额达人民币 47.147.147.147.1万亿元&#xff0c;比上年增长 7.2%7.2%7.2%7.2%&#xff1b;最终 消费支出拉动经济增长 4.34.34.3个百分点&#xff0c;比上年提高 3.13.13.1个百分点&#xff0c;对经济增长的贡献…

Python绘制的好看统计图

代码 sx [Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, P…

【Vue3 生命周期与组合式API】

文章目录 一、Vue3 生命周期概述二、Vue3 组合式API 与选项式API 的对比1. 选项式API 生命周期钩子函数常用的生命周期钩子函数包括&#xff1a; 2. 组合式API 的优势组合式API 的主要优势包括&#xff1a;在生命周期管理上的优势 三、Vue3 组合式API 生命周期钩子函数1. setup…

2024五一杯数学建模A题思路分析-钢板最优切割路径问题

文章目录 1 赛题选题分析 2 解题思路3 最新思路更新 1 赛题 A题 钢板最优切割路径问题 提高钢板下料切割过程中的工作效率&#xff0c;是模具加工企业降低成本和增加经济效益的重要途径&#xff0c;其中钢板切割的路径规划是钢板切割过程的一个关键环节。 钢板切割就是使用特殊…

C#知识|汇总方法重载与静态方法应用技巧

哈喽&#xff0c;你好&#xff0c;我是雷工&#xff01; 今天学习C#方法重载与静态方法应用技巧的相关内容。 01 方法重载有什么好处&#xff1f; 1.1、可以有效的减少类的对外接口&#xff08;只显示一个方法比较简洁&#xff09;&#xff0c;从而降低类的复杂度。 1.2、方便…

TCP/IP网络模型各层简介

第一张图是OSI参考模型&#xff0c;由国际标准组织ISO定义的理论模型。 第二张则是TCP/IP协议的网络模型&#xff0c;实际互联网所采用的网络协议族的基础架构&#xff0c;工作中也一般都是接触这个。 第三章是学习时一般使用的网络模型&#xff0c;尤其是《计算机网络-自顶向…