打印
[应用相关]

STM32和树莓派串口透传

[复制链接]
4236|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t60yz|  楼主 | 2021-6-25 23:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

最近做一个项目需要STM32和树莓派进行串口通信,实现原理如下:

第一步:使用USB转TTL分别调试STM32和树莓派的串口透传,确保可以通信;

第二步:确保第一步成功后,将树莓派和STM32连接,进行串口透传。

下面进行具体实验吧~


使用特权

评论回复
沙发
t60yz|  楼主 | 2021-6-25 23:35 | 只看该作者
树莓派环境串口透传
在开始前说明以下几点:

1、树莓派UART端口的位置:TXD位于HEAD-8;RXD位于HEAD-10;GND位于HEAD-6(可选其他GND)。

2、树莓派的TXD应接USB转串口设备的RXD,当然如果测试失败请交换RXD和TXD的顺序。

使用特权

评论回复
板凳
t60yz|  楼主 | 2021-6-25 23:40 | 只看该作者

使用特权

评论回复
地板
t60yz|  楼主 | 2021-6-25 23:41 | 只看该作者
树莓派串口通信需要配置环境,主要修改两处,具体如下:

第一处:进入  /boot/cmdline.txt 文件

使用特权

评论回复
5
t60yz|  楼主 | 2021-6-25 23:42 | 只看该作者
输入以下指令:
sudo nano /boot/cmdline.txt

使用特权

评论回复
6
t60yz|  楼主 | 2021-6-25 23:43 | 只看该作者
删除以下部分:
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

使用特权

评论回复
7
t60yz|  楼主 | 2021-6-25 23:45 | 只看该作者
最终为:

使用特权

评论回复
8
t60yz|  楼主 | 2021-6-25 23:46 | 只看该作者
第二步:进入  /etc/inittab  文件

使用特权

评论回复
9
t60yz|  楼主 | 2021-6-25 23:48 | 只看该作者
输入以下指令:
sudo nano /etc/inittab

使用特权

评论回复
10
t60yz|  楼主 | 2021-6-25 23:49 | 只看该作者
注释最后一行内容:
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

使用特权

评论回复
11
t60yz|  楼主 | 2021-6-25 23:50 | 只看该作者
配置完之后便可测试一下树莓派的UART是否正常工作,而minicom便是一个简单好用的工具。minicom是linux/树莓派平台串口调试工具,相当于windows上的串口调试助手。此时需要先安装minicom:
sudo apt-get install minicom

使用特权

评论回复
12
t60yz|  楼主 | 2021-6-25 23:51 | 只看该作者
接下来启动minicom工具:

minicom -b 9600 -o -D /dev/ttyAMA0
#-b代表波特率,-D代表端口,/dev/ttyAMA0 类似于windows中的COM1,-o功能暂时未知。

使用特权

评论回复
13
t60yz|  楼主 | 2021-6-25 23:52 | 只看该作者
效果如下:

使用特权

评论回复
14
t60yz|  楼主 | 2021-6-25 23:52 | 只看该作者
注意:

1、minicom发送内容直接在控制台中输入内容即可,如果minicom打开了回显可在控制台中观察到输出内容,如果回显关闭则控制台中没人任何反应,千万不要以为minicom没有正常工作。

2、minicom回显控制,先Ctrl+A,再E。可翻转回显状态(原来回显打开则此事回显关闭)

3、minicom回显关闭,先Ctrl+A,再Q。 

使用特权

评论回复
15
t60yz|  楼主 | 2021-6-25 23:53 | 只看该作者
minicom仅满足调试用途,如果需要编程解决问题那么python的serial扩展库——pyserial则是一个不错的选择。

收下需要安装pyserial扩展库,可使用pip或者easy_install安装,也可以直接选择apt-get工具安装。

使用特权

评论回复
16
t60yz|  楼主 | 2021-6-25 23:54 | 只看该作者
若使用apt-get工具安装,可输入以下指令:
sudo apt-get install python-serial

使用特权

评论回复
17
t60yz|  楼主 | 2021-6-25 23:55 | 只看该作者
当以上步骤成功后,就可以使用Python编写树莓派串口透传程序,具体Demo如下:

# -*- 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()

使用特权

评论回复
18
t60yz|  楼主 | 2021-6-25 23:56 | 只看该作者
此时实现了树莓派的串口通信功能。

使用特权

评论回复
19
t60yz|  楼主 | 2021-6-25 23:56 | 只看该作者
STM32环境串口透传
接下来实现STM32串口透传,这里我使用的MCU是STM32F103C8T6,配置UART1,STM32不需要配置环境直接在Demo中配置GPIO即可,将USB转TTL的TX连接STM32的RX(PA10),USB转TTL的RX连接STM32的TX(PA9),核心Demo如下:

使用特权

评论回复
20
t60yz|  楼主 | 2021-6-25 23:57 | 只看该作者
#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);
        }      
       }     
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

903

帖子

0

粉丝