目录
一、树莓派通信
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 serialimport timeser = 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_buffer uart_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