1. 程式人生 > >STM32和樹莓派串列埠透傳

STM32和樹莓派串列埠透傳

目錄

樹莓派環境串列埠透傳

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 檔案

輸入以下指令:

sudo nano /boot/cmdline.txt

刪除以下部分:

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

最終變為:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

 第二步:進入  /etc/inittab  檔案

輸入以下指令:

sudo nano /etc/inittab

註釋最後一行內容:

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

配置完之後便可測試一下樹莓派的UART是否正常工作,而minicom便是一個簡單好用的工具。minicom是linux/樹莓派平臺串列埠除錯工具,相當於windows上的串列埠除錯助手。此時需要先安裝minicom:

sudo apt-get install minicom

接下來啟動minicom工具:

minicom -b 9600 -o -D /dev/ttyAMA0
#-b代表波特率,-D代表埠,/dev/ttyAMA0 類似於windows中的COM1,-o功能暫時未知。

效果如下:

注意:

1、minicom傳送內容直接在控制檯中輸入內容即可,如果minicom打開了回顯可在控制檯中觀察到輸出內容,如果回顯關閉則控制檯中沒人任何反應,千萬不要以為minicom沒有正常工作。

2、minicom回顯控制,先Ctrl+A,再E。可翻轉回顯狀態(原來回顯開啟則此事回顯關閉)

3、minicom回顯關閉,先Ctrl+A,再Q。 

minicom僅滿足除錯用途,如果需要程式設計解決問題那麼python的serial擴充套件庫——pyserial則是一個不錯的選擇。

收下需要安裝pyserial擴充套件庫,可使用pip或者easy_install安裝,也可以直接選擇apt-get工具安裝。
若使用apt-get工具安裝,可輸入以下指令:

sudo apt-get install python-serial

當以上步驟成功後,就可以使用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()

此時實現了樹莓派的串列埠通訊功能。

  • STM32環境串列埠透傳

接下來實現STM32串列埠透傳,這裡我使用的MCU是STM32F103C8T6,配置UART1,STM32不需要配置環境直接在Demo中配置GPIO即可,將USB轉TTL的TX連線STM32的RX(PA10),USB轉TTL的RX連線STM32的TX(PA9),核心Demo如下:

#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);
        }      
       }     
}

若有疑問可下載具體工程Demo:https://download.csdn.net/download/m0_38106923/10799470

當STM32測試成功後,恭喜各位,將樹莓派的TX和STM32的RX(PA10)連線,樹莓派的RX和STM32的TX連線(PA9),注意一定要將STM32的GND和樹莓派的GND連線,即可實現STM32和樹莓派串列埠通訊。