树莓派与STM32(RT1064)的串口通信实现

在物联网项目中,树莓派和STM32微控制器经常被用来协同工作。树莓派作为一个功能强大的单板计算机,可以处理复杂的计算和网络任务,而STM32微控制器则可以处理低层次的硬件控制和数据采集。本文将介绍如何实现树莓派与STM32(RT1064)之间的串口通信。

引言

串口通信是一种常见的异步通信方式,它允许设备之间通过串行接口交换数据。在树莓派与STM32的通信中,串口通信可以用于传输传感器数据、控制命令等。本文将详细介绍如何设置和编程树莓派和STM32,以实现它们之间的串口通信。

硬件准备

  1. 树莓派:任何型号均可,本例以树莓派4为例。
  2. STM32(RT1064)开发板:带有USART外设的开发板。
  3. 跳线:用于连接树莓派和STM32开发板。
  4. 电源:为STM32开发板供电。

软件和工具

  1. Raspbian OS:树莓派操作系统。
  2. STM32CubeIDE:STM32开发环境。
  3. 串口助手软件:用于测试和调试。

树莓派端设置

1. 启用串口

树莓派默认情况下禁用了串口,需要在启动配置中启用。

  1. 打开 /boot/config.txt 文件:

    bash 复制代码
    sudo nano /boot/config.txt
  2. 添加或取消注释以下行:

    plaintext 复制代码
    # Enable the serial interface
    enable_uart=1
  3. 重启树莓派。

2. 安装Python串口库

使用Python进行串口通信,需要安装 pyserial 库。

bash 复制代码
sudo pip3 install pyserial

3. 树莓派端代码

python 复制代码
import serial
import time

# 配置串口
ser = serial.Serial('/dev/serial0', 115200, timeout=1)

def send_data(data):
    ser.write(data.encode())

def read_data():
    while ser.in_waiting:
        return ser.read(ser.in_waiting).decode()

try:
    while True:
        # 发送数据
        send_data("Hello STM32!")
        print("Sent: Hello STM32!")
        
        # 读取数据
        response = read_data()
        print("Received:", response)
        
        time.sleep(1)  # 等待1秒
except KeyboardInterrupt:
    ser.close()
    print("Serial connection closed.")

STM32端设置

1. 配置USART

使用STM32CubeIDE创建一个新项目,并配置USART外设。

  1. 打开STM32CubeIDE,创建新项目。
  2. 选择STM32(RT1064)开发板。
  3. Pinout & Configuration 工具中,启用USART外设。
  4. 配置波特率为115200。

2. STM32端代码

c 复制代码
#include "stm32f1xx_hal.h"

UART_HandleTypeDef huart1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  char rx_buffer[100];
  
  while (1)
  {
    // 接收数据
    if (HAL_UART_Receive(&huart1, (uint8_t *)rx_buffer, 100, 1000) == HAL_OK)
    {
      // 发送数据
      HAL_UART_Transmit(&huart1, (uint8_t *)rx_buffer, strlen(rx_buffer), 1000);
    }
  }
}

static void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
}

void Error_Handler(void)
{
  // 错误处理代码
  while(1);
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
  // 用户可以添加错误处理代码
}
#endif

调试与测试

  1. 连接硬件:使用跳线将树莓派的串口(GPIO 14, 15)连接到STM32的USART TX和RX引脚。
  2. 运行代码:在树莓派和STM32上分别运行上述代码。
  3. 检查通信:使用串口助手软件检查数据传输是否正常。

常见问题及解决方法

问题1:无法建立通信

解决方法:

  • 检查硬件连接是否正确。
  • 确保树莓派和STM32的波特率设置一致。
  • 检查STM32的USART配置是否正确。

问题2:数据丢失

解决方法:

  • 增加接收缓冲区的大小。
  • 调整接收超时时间。

问题3:树莓派串口被占用

解决方法:

  • 禁用树莓派的蓝牙功能,释放串口。
  • 使用USB转串口模块。

结论

本文详细介绍了如何实现树莓派与STM32(RT1064)之间的串口通信。通过硬件连接、软件编程和调试测试,可以实现两者之间的数据交换。在实际应用中,开发者可以根据具体需求调整代码和配置,以满足不同的通信需求。

参考文献

  1. STM32参考手册
  2. 树莓派官方文档
  3. PySerial官方文档

请注意,以上代码仅为示例,实际应用中需要根据具体硬件和需求进行调整和优化。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

相关推荐
drinow13 分钟前
【纸飞机串口调试工具】预设曲线名称
arm开发·驱动开发·单片机·mcu·dsp开发·fpga·iot
时光の尘36 分钟前
C语言菜鸟入门·关键字·int的用法
c语言·开发语言·数据结构·c++·单片机·链表·c
深圳市青牛科技实业有限公司 小芋圆2 小时前
【青牛科技】 GC2803:白色家电与安防领域的卓越驱动芯片可替代ULN2803
科技·单片机·嵌入式硬件·电脑·白色家电·电动卷帘门·工业设备
Arciab4 小时前
51单片机入门:LED灯控制(01)
单片机·led·51
LaoZhangGong1234 小时前
Linux第95步_Linux内核中的INPUT子系统
linux·运维·数据库·经验分享·stm32·input·stm32mp127
BreezeJuvenile6 小时前
STM32总体架构简单介绍
stm32·单片机·嵌入式硬件
scgg7 小时前
STM32抢占优先级不生效
stm32·疑问
可乐鸡翅好好吃8 小时前
STM32的中断(什么是外部中断和其他中断以及中断号是什么)
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·51单片机
没有余地 EliasJie9 小时前
深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录
人工智能·嵌入式硬件·深度学习
嵌入式大圣10 小时前
单片机在电路板中的应用
单片机·嵌入式硬件