当前位置:   article > 正文

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

openmv串口通信

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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);
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/399456
推荐阅读
相关标签
  

闽ICP备14008679号