最近做一個(gè)項(xiàng)目需要STM32和樹莓派進(jìn)行串口通信亲轨,實(shí)現(xiàn)原理如下:
第一步:使用USB轉(zhuǎn)TTL分別調(diào)試STM32和樹莓派的串口透傳醇坝,確比拍可以通信;
第二步:確保第一步成功后坠非,將樹莓派和STM32連接敏沉,進(jìn)行串口透傳才菠。
下面進(jìn)行具體實(shí)驗(yàn)吧~
樹莓派環(huán)境串口透傳
在開始前說明以下幾點(diǎn):
1被啼、樹莓派UART端口的位置:TXD位于HEAD-8孙技;RXD位于HEAD-10踱承;GND位于HEAD-6(可選其他GND)。
2攒菠、樹莓派的TXD應(yīng)接USB轉(zhuǎn)串口設(shè)備的RXD迫皱,當(dāng)然如果測試失敗請(qǐng)交換RXD和TXD的順序。
樹莓派串口通信需要配置環(huán)境辖众,主要修改兩處卓起,具體如下:
第一處:進(jìn)入? /boot/cmdline.txt 文件
輸入以下指令:
sudo nano /boot/cmdline.txt
刪除以下部分:
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
最終變?yōu)椋?/p>
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
第二步:進(jìn)入??/etc/inittab? 文件
輸入以下指令:
sudo nano /etc/inittab
注釋最后一行內(nèi)容:
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
配置完之后便可測試一下樹莓派的UART是否正常工作,而minicom便是一個(gè)簡單好用的工具凹炸。minicom是linux/樹莓派平臺(tái)串口調(diào)試工具戏阅,相當(dāng)于windows上的串口調(diào)試助手。此時(shí)需要先安裝minicom:
sudo apt-get install minicom
接下來啟動(dòng)minicom工具:
minicom -b 9600 -o -D /dev/ttyAMA0
#-b代表波特率啤它,-D代表端口奕筐,/dev/ttyAMA0 類似于windows中的COM1,-o功能暫時(shí)未知变骡。
效果如下:
注意:
1离赫、minicom發(fā)送內(nèi)容直接在控制臺(tái)中輸入內(nèi)容即可,如果minicom打開了回顯可在控制臺(tái)中觀察到輸出內(nèi)容塌碌,如果回顯關(guān)閉則控制臺(tái)中沒人任何反應(yīng)渊胸,千萬不要以為minicom沒有正常工作。
2台妆、minicom回顯控制翎猛,先Ctrl+A,再E频丘“斐桑可翻轉(zhuǎn)回顯狀態(tài)(原來回顯打開則此事回顯關(guān)閉)
3、minicom回顯關(guān)閉搂漠,先Ctrl+A,再Q(mào)某弦。?
minicom僅滿足調(diào)試用途桐汤,如果需要編程解決問題那么python的serial擴(kuò)展庫——pyserial則是一個(gè)不錯(cuò)的選擇。
收下需要安裝pyserial擴(kuò)展庫靶壮,可使用pip或者easy_install安裝怔毛,也可以直接選擇apt-get工具安裝。
若使用apt-get工具安裝腾降,可輸入以下指令:
sudo apt-get install python-serial
當(dāng)以上步驟成功后拣度,就可以使用Python編寫樹莓派串口透傳程序,具體Demo如下:
# -*- coding: utf-8 -*
import serial
import time
# 打開串口
ser = serial.Serial("/dev/ttyAMA0", 9600)
def main():
? ? while True:
? ? ? ? # 獲得接收緩沖區(qū)字符
? ? ? ? count = ser.inWaiting()
? ? ? ? if count != 0:
? ? ? ? ? ? # 讀取內(nèi)容并回顯
? ? ? ? ? ? recv = ser.read(count)
? ? ? ? ? ? ser.write(recv)
? ? ? ? # 清空接收緩沖區(qū)
? ? ? ? ser.flushInput()
? ? ? ? # 必要的軟件延時(shí)
? ? ? ? time.sleep(0.1)
if __name__ == '__main__':
? ? try:
? ? ? ? main()
? ? except KeyboardInterrupt:
? ? ? ? if ser != None:
? ? ? ? ? ? ser.close()
此時(shí)實(shí)現(xiàn)了樹莓派的串口通信功能。
STM32環(huán)境串口透傳
接下來實(shí)現(xiàn)STM32串口透傳抗果,這里我使用的MCU是STM32F103C8T6筋帖,配置UART1,STM32不需要配置環(huán)境直接在Demo中配置GPIO即可冤馏,將USB轉(zhuǎn)TTL的TX連接STM32的RX(PA10)日麸,USB轉(zhuǎn)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);
? ? ? ? }? ? ?
? ? ? }? ?
}
當(dāng)STM32測試成功后逮光,恭喜各位代箭,將樹莓派的TX和STM32的RX(PA10)連接,樹莓派的RX和STM32的TX連接(PA9)涕刚,注意一定要將STM32的GND和樹莓派的GND連接嗡综,即可實(shí)現(xiàn)STM32和樹莓派串口通信。