在物联网项目中,树莓派和STM32微控制器经常被用来协同工作。树莓派作为一个功能强大的单板计算机,可以处理复杂的计算和网络任务,而STM32微控制器则可以处理低层次的硬件控制和数据采集。本文将介绍如何实现树莓派与STM32(RT1064)之间的串口通信。
引言
串口通信是一种常见的异步通信方式,它允许设备之间通过串行接口交换数据。在树莓派与STM32的通信中,串口通信可以用于传输传感器数据、控制命令等。本文将详细介绍如何设置和编程树莓派和STM32,以实现它们之间的串口通信。
硬件准备
- 树莓派:任何型号均可,本例以树莓派4为例。
- STM32(RT1064)开发板:带有USART外设的开发板。
- 跳线:用于连接树莓派和STM32开发板。
- 电源:为STM32开发板供电。
软件和工具
- Raspbian OS:树莓派操作系统。
- STM32CubeIDE:STM32开发环境。
- 串口助手软件:用于测试和调试。
树莓派端设置
1. 启用串口
树莓派默认情况下禁用了串口,需要在启动配置中启用。
-
打开
/boot/config.txt
文件:bashsudo nano /boot/config.txt
-
添加或取消注释以下行:
plaintext# Enable the serial interface enable_uart=1
-
重启树莓派。
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外设。
- 打开STM32CubeIDE,创建新项目。
- 选择STM32(RT1064)开发板。
- 在
Pinout & Configuration
工具中,启用USART外设。 - 配置波特率为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
调试与测试
- 连接硬件:使用跳线将树莓派的串口(GPIO 14, 15)连接到STM32的USART TX和RX引脚。
- 运行代码:在树莓派和STM32上分别运行上述代码。
- 检查通信:使用串口助手软件检查数据传输是否正常。
常见问题及解决方法
问题1:无法建立通信
解决方法:
- 检查硬件连接是否正确。
- 确保树莓派和STM32的波特率设置一致。
- 检查STM32的USART配置是否正确。
问题2:数据丢失
解决方法:
- 增加接收缓冲区的大小。
- 调整接收超时时间。
问题3:树莓派串口被占用
解决方法:
- 禁用树莓派的蓝牙功能,释放串口。
- 使用USB转串口模块。
结论
本文详细介绍了如何实现树莓派与STM32(RT1064)之间的串口通信。通过硬件连接、软件编程和调试测试,可以实现两者之间的数据交换。在实际应用中,开发者可以根据具体需求调整代码和配置,以满足不同的通信需求。
参考文献
- STM32参考手册
- 树莓派官方文档
- PySerial官方文档
请注意,以上代码仅为示例,实际应用中需要根据具体硬件和需求进行调整和优化。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇