单片机与Python串口通讯

一、单片机端

        串口是一条城乡之间的窄道(连接单片机和外设),一次只能并排走八个人(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 + 1
                    print(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()
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python串口通信是指使用Python编程语言操作串口进行通信。它是一种简单、灵活、可移植的工具,能够很方便地实现单片机与电脑之间的通讯。下面我们通过一个实例来了解Python串口通信。 该实例涉及到的硬件设备为Arduino UNO开发板和电脑,通过串口进行通讯,并使用Python编写程序。首先,我们需要在Arduino开发板上编写程序,如下所示: void setup() { Serial.begin(9600); } void loop() { Serial.println("Hello World!"); delay(1000); } 代码简单地实现了向串口发送"Hello World!"的功能,并且每隔1秒进行一次发送。 接下来,我们在电脑上使用Python编写程序,在Windows系统下可使用pyserial库进行串口通信。代码如下所示: import serial ser = serial.Serial('COM3', 9600) # 串口参数:端口号、波特率 while True: if ser.in_waiting: # 等待串口接收数据 data = ser.readline().decode().strip() # 读取数据 print(data) # 打印数据 代码进行了如下操作: 1. 引入pyserial库并创建串口对象ser,指定端口号为COM3,波特率为9600。 2. 在无限循环中,等待串口接收数据,当接收到数据时,通过readline()函数读取数据,并使用decode()函数将字节流转换为字符串,并使用strip()函数去除字符串中的空格和换行符。 3. 最后将读取的数据打印出来。 这样就可以通过Python实现串口通信的功能,而且在Linux和Mac OS X等操作系统上同样适用,因为pyserial库为跨平台支持。 ### 回答2: Python串口通信是Python语言在串口通信领域的应用实践,具有以简洁、清晰、易学易用、可扩展等优点。下面就Python串口通信实例进行介绍,以帮助读者更好地了解并运用Python串口通信。 Python串口通信的实现主要涉及到pySerial模块的运用,该模块提供了类似于Windows API的串口通信接口,可用于串口数据的读写操作。在运用pySerial模块实现Python串口通信前,我们需要了解串口通信需要的一些参数,如波特率、数据位、校验位和停止位等。 了解了这些基础知识后,接下来我们可以实现一个Python串口通信的实例——读取传感器数据。假设我们需要从串口中读取连接到电脑的传感器的数据。步骤如下: 1. 导入pySerial模块:使用import语句导入pySerial模块。 2. 打开串口:使用pySerial的Serial()函数打开串口,例如:ser = serial.Serial('COM1', 9600, timeout=0.5)。 3. 读取数据:使用read()函数读取串口传回的数据。 4. 解析数据:将串口读取到的二进制数据转换成“人类可以读懂”的文本格式。 5. 处理数据:对数据进行适当的处理,如进行计算或存储。 该实例完整代码为: import serial ser = serial.Serial('COM1', 9600, timeout=0.5) while True: data = ser.read(12) if data != b'': data_str = data.decode('utf-8') data_list = data_str.split(',') data_1 = float(data_list[0]) data_2 = float(data_list[1]) # 对数据进行处理,如进行计算或存储 通过以上步骤,我们就可以成功读取传感器数据并进行相应的处理。以上实例只是Python串口通信的一个简单例子,具体的实现方法还需要根据实际情况进行调整,但是总体思路是相似的。Python串口通信具有较广泛的应用场景,如连接机器人、太阳能电池等,可以大大提高系统效率,开发者可以根据自己的需求,更好地运用Python串口通信技术。 ### 回答3: Python是一种非常流行的编程语言,它有很强的可扩展性和通用性,用于开发各种应用程序。其中一个典型的应用是串口通信,它可以将电脑连接到其他设备上。本文将介绍Python串口通信实例的基本原理和使用方法。 首先,在Python中使用串口通信需要安装PySerial库。这个库可以通过pip安装,具体命令为“pip install pyserial”。安装完成后,可以打开Python环境,在命令行中导入serial库,开始使用串口通信功能。 其次,串口通信需要打开串口,指定通信的波特率和字节大小等参数。在PySerial库中,可以使用serial.Serial()来创建一个串口对象。例如: ``` import serial ser = serial.Serial('COM1', 9600, timeout=1) ``` 其中,'COM1'是串口的名字,9600是波特率,timeout=1表示超时时间为1秒。当串口打开后,就可以开始发送和接收数据了。 最后,使用串口通信时,一般要使用循环来读取数据。例如: ``` while True: data = ser.read(1) if data: print("Received: ", data) ``` 这个循环会一直执行,从串口中读取一个字节的数据,并将其打印出来。 以上就是Python串口通信的基本使用方法。通过安装PySerial库,创建串口对象,并使用循环读取数据,可以实现串口和电脑的通信。这种方法可以应用于各种场景,例如机器人控制、传感器数据采集等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值