> 文章列表 > 树莓派与STM32(rt1064)串口通信

树莓派与STM32(rt1064)串口通信

树莓派与STM32(rt1064)串口通信

目录

一、树莓派通信

1、硬件连线准备

2、安装Serial和打开树莓派串口

2.1安装Serial

2.2打开树莓派串口

2.3修改串口映射关系

3、树莓派代码

4、上位

5、运行uart.py代码进行测试

5.1 树莓派发送,上位机接收

5.2上位机发送,树莓派接收

 二、STM32通信

6、配置串口

7、测试STM32通信

7.1 STM32发送数据,上位机接收数据

7.2 上位机发送数据,STM32接收数据

三、树莓派与STM32通信

8、树莓派与STM32通信测试


一、树莓派通信

1、硬件连线准备

树莓派4B、杜邦线、TTL转USB(只是验证树莓派功能,与STM32通信只需要杜邦线)

树莓派 RX 与TTL-USB TX相连接   树莓派TX与TTL-USB RX相连接 

 

 

2、安装Serial和打开树莓派串口

2.1安装Serial

输入 sudo apt-get install serial

2.2打开树莓派串口

终端输入sudo raspi-config打开界面设置

sudo raspi-config

 Interfacing Options→serial→否→是

输入ls -l /dev查看设备

ls -l /dev

 

 

2.3修改串口映射关系

输入sudo nano /boot/config.txt

sudo nano /boot/config.txt

末行添加 dtoverlay=pi3-miniuart-bit

 输入ls -l /dev查看设备

 

3、树莓派代码

 Xshell7和MobaXterm

uart.py代码如下

 

# -*- coding: utf-8 -*-
import serial
import time
ser = serial.Serial('/dev/ttyAMA0', 115200) #打开串口设备
if ser.isOpen == False:ser.open()          # 打开串口    
a=ser.write(b"x09")     
print(a)
try:while True:size = ser.inWaiting()  	# 获得缓冲区字符if size != 0:res = ser.read(size)   	# 读取内容并显示print(res)print(ser.bytesize) #字节大小 if res == b'\\x01\\r\\n':ser.write(b'\\x05')print(ser.baudrate) #波特率    elif res == b'\\x02':ser.write(b'\\x06')print(ser.baudrate) #波特率 elif res == b'\\x03':ser.write(b'\\x07')print(ser.baudrate) #波特率                 elif res == b'\\x04':ser.write(b'\\x08')print(ser.baudrate) #波特率                                                     ser.flushInput()		# 情况接收缓存区time.sleep(0.5)			# 软件延时
except KeyboardInterrupt:ser.close()

 

4、上位机

我用的是正点原子的XCOM2.1 (这个官网都有免费的自己去下一下)

5、运行uart.py代码进行测试

5.1 树莓派发送,上位机接收

运行代码

 测试结果

树莓派发送 a=ser.write(b'x09')

 上位机接收:x09   (16进制不显示)

 5.2上位机发送,树莓派接收

上位机发送0x01

树莓派接收数据并反馈数据

 if res == b'\\x01\\r\\n':   #如果接受到 \\x01\\r\\n (注意:树莓派接受数据和发送数据格式请严格要求)
     ser.write(b'\\x05')   #树莓派发送 \\x05   上位机接受(16进制显示)

 

 二、STM32通信

芯片是RT1064  板子是学习版,都是在智能车比赛 逐飞科技 买的(实验室拿学弟的)。

6、配置串口

配置好后,发送是 uart_putchar(USART_1,0x01);    //串口发送函数

接受是 uart_data这个变量,不要用库函数的接收函数,用了,程序会卡住,因为等待接收当然会卡住。


//整套推荐IO查看Projecct文件夹下的TXT文
//打开新的工程或者工程移动了位置务必执行以下操作
//第一步 关闭上面所有打开的文件
//第二步 project  clean  等待下方进度条走完#include "headfile.h"uint8 example_rx_buffer;
lpuart_transfer_t   example_receivexfer;
lpuart_handle_t     example_g_lpuartHandle;uint8 uart_data;
uint8 uart_send;
uint8 dat;void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
{if(kStatus_LPUART_RxIdle == status){//数据已经被写入到了 之前设置的BUFF中//本例程使用的BUFF为 example_rx_bufferuart_data = example_rx_buffer;//将数据取出}handle->rxDataSize = example_receivexfer.dataSize;  //还原缓冲区长度handle->rxData = example_receivexfer.data;          //还原缓冲区地址
}int main(void)
{DisableGlobalIRQ();board_init();//务必保留,本函数用于初始化MPU 时钟 调试串口uart_init (USART_1, 115200,UART1_TX_B12,UART1_RX_B13);	NVIC_SetPriority(LPUART1_IRQn,15);         //设置串口中断优先级 范围0-15 越小优先级越高uart_rx_irq(USART_1,1);//配置串口接收的缓冲区及缓冲区长度example_receivexfer.dataSize = 1;example_receivexfer.data = &example_rx_buffer;//设置中断函数及其参数uart_set_handle(USART_1, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);NVIC_SetPriority(PIT_IRQn,10);  //设置中断优先级 范围0-15 越小优先级越高 四路PIT共用一个PIT中断函数EnableGlobalIRQ(0);while (1){			uart_putchar(USART_1,0x01);	//串口发送函数		}
}

7、测试STM32通信

7.1 STM32发送数据,上位机接收数据

STM32发送0x01 ,上位机一直接收。

7.2 上位机发送数据,STM32接收数据

上位机发送0x09,STM32接收到并发送0x15.

三、树莓派与STM32通信

 最后其实就把STM32与树莓派用杜邦线连接就行,不用TTL-USB接口。

8、树莓派与STM32通信测试

按键模拟发送信号,STM32向树莓派发送数据,树莓派接收到数据后,向STM32发送命令控制小车电机转动。

按键按下(STM32发送‘0x01')→树莓派接收’\\x01',发送‘\\x05'→STM32接收到’0x05' 控制小车电机转动。(注意:树莓派与STM32的收发数据格式与上位机不同,最好自己动手实验)四个按键模拟4种信号(前后左右)每个信号控制一个轮子转动。

       

beauty_202304172231556866