赞
踩
2023/08/18
在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_int
为 0x 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);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。