3805| 2
|
[教程] 如何实现STM32和树莓派串口透传? |
最近做一个项目需要STM32和树莓派进行串口通信,实现原理如下: 第一步:使用USB转TTL分别调试STM32和树莓派的串口透传,确保可以通信; 第二步:确保第一步成功后,将树莓派和STM32连接,进行串口透传。 下面进行具体实验吧~ 树莓派环境串口透传在开始前说明以下几点: 1、树莓派UART端口的位置:TXD位于HEAD-8;RXD位于HEAD-10;GND位于HEAD-6(可选其他GND)。 2、树莓派的TXD应接USB转串口设备的RXD,当然如果测试失败请交换RXD和TXD的顺序。 树莓派串口通信需要配置环境,主要修改两处,具体如下: 第一处:进入 /boot/cmdline.txt 文件 输入以下指令: [mw_shl_code=c,false]sudo nano /boot/cmdline.txt[/mw_shl_code]删除以下部分: [mw_shl_code=c,false]console=ttyAMA0,115200 kgdboc=ttyAMA0,115200[/mw_shl_code]最终变为: [mw_shl_code=c,false]dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait[/mw_shl_code] 第二步:进入 /etc/inittab 文件 输入以下指令: [mw_shl_code=c,false]sudo nano /etc/inittab[/mw_shl_code]注释最后一行内容: [mw_shl_code=c,false]#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100[/mw_shl_code]配置完之后便可测试一下树莓派的UART是否正常工作,而minicom便是一个简单好用的工具。minicom是linux/树莓派平台串口调试工具,相当于windows上的串口调试助手。此时需要先安装minicom: [mw_shl_code=c,false]sudo apt-get install minicom[/mw_shl_code]接下来启动minicom工具: [mw_shl_code=c,false]minicom -b 9600 -o -D /dev/ttyAMA0#-b代表波特率,-D代表端口,/dev/ttyAMA0 类似于windows中的COM1,-o功能暂时未知。[/mw_shl_code] 效果如下: 注意: 1、minicom发送内容直接在控制台中输入内容即可,如果minicom打开了回显可在控制台中观察到输出内容,如果回显关闭则控制台中没人任何反应,千万不要以为minicom没有正常工作。 2、minicom回显控制,先Ctrl+A,再E。可翻转回显状态(原来回显打开则此事回显关闭) 3、minicom回显关闭,先Ctrl+A,再Q。 minicom仅满足调试用途,如果需要编程解决问题那么python的serial扩展库——pyserial则是一个不错的选择。 收下需要安装pyserial扩展库,可使用pip或者easy_install安装,也可以直接选择apt-get工具安装。 [mw_shl_code=c,false]sudo apt-get install python-serial[/mw_shl_code]若使用apt-get工具安装,可输入以下指令: 当以上步骤成功后,就可以使用Python编写树莓派串口透传程序,具体Demo如下: [mw_shl_code=c,false]# -*- coding: utf-8 -*import serial import time # 打开串口 ser = serial.Serial("/dev/ttyAMA0", 9600) def main(): while True: # 获得接收缓冲区字符 count = ser.inWaiting() if count != 0: # 读取内容并回显 recv = ser.read(count) ser.write(recv) # 清空接收缓冲区 ser.flushInput() # 必要的软件延时 time.sleep(0.1) if __name__ == '__main__': try: main() except KeyboardInterrupt: if ser != None: ser.close()[/mw_shl_code] 此时实现了树莓派的串口通信功能。 STM32环境串口透传接下来实现STM32串口透传,这里我使用的MCU是STM32F103C8T6,配置UART1,STM32不需要配置环境直接在Demo中配置GPIO即可,将USB转TTL的TX连接STM32的RX(PA10),USB转TTL的RX连接STM32的TX(PA9),核心Demo如下: [mw_shl_code=c,false]#include "usart1.h" #include <stdarg.h> void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void UART1SendByte(unsigned char SendData) { USART_SendData(USART1,SendData); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } unsigned char UART1GetByte(unsigned char* GetData) { if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) { return 0; } *GetData = USART_ReceiveData(USART1); return 1; } void UART1Test(void) { unsigned char i = 0; while(1) { while(UART1GetByte(&i)) { USART_SendData(USART1,i); } } }[/mw_shl_code] |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed