Raspberry 4B 串口通信
串口通信
- 組件
- 操作步驟
- 查看樹莓派4B的硬件串口與mini串口默認映射關系
- 修改串口映射關系
- 禁用串口的控制臺功能
- 測試串口通信
- 使用python實現串口的發送和接收
- 使用C++實現串口的發送和接收
組件
- Raspberry Pi 4 B+主板*1
- 樹莓派電源*1
- USB TO TTL模塊*1
- 樹莓派管腳圖
第1步: 連接電路,使用USB TO TTL模塊連接好樹莓派的串口和PC電腦的USB接口。
| TXD | RXD |
| RXD | TXD |
| GND | GND |
注意:
- 樹莓派TXD引腳接 USB TO TTL模塊 RXD 引腳
- 樹莓派RXD 引腳接 USB TO TTL模塊 TXD 引腳
- 樹莓派GND引腳一定要和USB TO TTL模塊GND引腳接好,否則在發送數據的過程中會出現亂碼。
樹莓派默認的映射關系:
pi@raspberrypi:~ $ ls -l /dev
lrwxrwxrwx 1 root root 7 8月 13 07:34 serial0 -> ttyS0
lrwxrwxrwx 1 root root 5 8月 13 07:34 serial1 -> ttyAMA0
由以上映射關系可以看到
- serial0是GPIO引腳對應的串口,默認使用的是ttyS0 (mini串口)
- serial1是藍牙對應的串口,默認使用的是ttyAMA0(硬件串口)
操作步驟
Raspberry 4B 串口通信 實現流程大致如下:
- 查看Raspberry 4B 的硬件串口與mini串口默認映射關系
- 修改串口映射關系
- 禁用串口的控制臺功能
- 測試串口通信
查看樹莓派4B的硬件串口與mini串口默認映射關系
在/boot/overlays文件內有兩個文件,README和 miniuart-bt.dtbo,首先查看有沒有相關文件。
cd /boot/overlays/ ls REA* mini*
README文件中說明了此文件的功能是將樹莓派3B,3B+, 3A+, 4B, Zero的藍牙切換到mini串口(ttyS0),并且恢復硬件串口(ttyAMA0)到GPIO14&15引腳中。
修改串口映射關系
執行命令
sudo gedit /boot/config.txt在文件的末尾加上一行代碼
dtoverlay=miniuart-bt
然后"ctrl+s"保存文件, 執行sudo reboot重啟樹莓派,使修改生效。
再查看映射關系已經改變:
pi@raspberrypi:~ $ ls -l /dev
lrwxrwxrwx 1 root root 7 8月 13 07:34 serial0 -> ttyAMA0
lrwxrwxrwx 1 root root 5 8月 13 07:34 serial1 -> ttyS0
對比修改前的關系,可以看出 serial0 和 serial1 與 ttyAMA0 和 ttyS0 的映射關系對換完成了,也就是ttyAMA0映射到了引出的GPIO Tx(14) Rx(15) 引腳上。
禁用串口的控制臺功能
在樹莓派命令窗口中分別通過如下兩個命令停止和禁用串口的控制臺功能。
由于我們前面已經交換了串口的映射關系,因此這里注意是ttyAMA0。
再執行命令:
sudo gedit /boot/cmdline.txt在文檔中刪除語句 console=serial0,115200
然后保存文件,重新啟動樹莓派,使修改生效。
測試串口通信
完成以上操作,樹莓派 4B的串口配置就可以直接用了,下面用python-serial模塊做一個樹莓派串口與電腦USB TO TTL串口通信的測試。
1、首先將樹莓派的串口和 USB TO TTL 串口連接好,并將 USB TO TTL 串口插到電腦端上。
2、安裝python-serial模塊,一般都是樹莓派系統默認已經安裝好,可以直接跳過該步驟。
3、輸入phthon3啟動python IDE。
4、創建serial實例ser,端口為 ‘/dev/ttyAMA0’,波特率設置為115200bps,第三個為校驗位,可以不寫。
>>> import serial
>>> ser = serial.Serial(’/dev/ttyAMA0’,115200)
5、檢驗串口是否打開,若未打開則輸入 ser.open() 打開
>>> ser.isOpen()
True
7、電腦上打開串口調試助手,選擇 USB TO TTL插入電腦上顯示的串口號,波特率選擇115200。
測試用的串口助手是STC-ISP里面的串口助手
8、然后我們在樹莓派的python里向電腦的串口助手發消息,檢測發送是否正常:
>>> ser.write(b’hello’)
5
可以看到在接收緩沖區接收到了樹莓派通過串口發送的 hello 消息。
使用python實現串口的發送和接收
# -*- coding: utf-8 -* #! /usr/bin/env python import serial import timeser = serial.Serial('/dev/ttyAMA0', 115200) # 設置端口和波特率 if ser.isOpen == False: # 檢查串口是否打開ser.open() # 打開串口 ser.write(b"Raspberry pi is ready") try:while True:size = ser.inWaiting() # 獲得緩沖區字符if size != 0:response = ser.read(size) # 讀取內容并顯示print(response) ser.flushInput() # 清空接收緩存區time.sleep(0.5) # 軟件延時 except KeyboardInterrupt:ser.close()將以上代碼保存為“uart_communication.py”,然后執行Python文件
python uart_communication.py運行樹莓派端的python程序,通信過程如下:
使用C++實現串口的發送和接收
以下為C++實現數據的發送
#include <stdio.h> #include <wiringPi.h> #include <wiringSerial.h>int main(){int fd;if(wiringPiSetup()<0)return 1;if((fd=serialOpen("/dev/ttyAMA0", 115200))<0)return 1;printf("Raspberry pi is ready ...\n");serialPrintf(fd,"hello C++!!\n");serialClose(fd);return 0; }將以上代碼保存為“uart_communication.cpp”,然后執行C++文件
g++ uart_communication.cpp -o uart_communication -lwiringPi sudo ./uart_communication
打開并初始串口:
int serialOpen (char *device, int baud)
- device:串口的地址,在Linux中就是設備所在的目錄。
- 默認一般是"/dev/ttyAMA0"
- baud:波特率
- 返回:正常返回文件描述符,否則返回-1失敗。
像使用C語言中的printf一樣發送數據到串口:
void serialPrintf (int fd, char *message, …)
-
fd:文件描述符
-
message:格式化的字符串
當使用這個函數初始化樹莓派引腳時,程序使用的是wiringPi 引腳編號表。引腳的編號為 0~16
需要root權限
int wiringPiSetup (void)
- 返回:執行狀態,-1表示失敗
發送一個字符串到串口
void serialPuts (int fd, char *s)
- fd:文件描述符
- s:發送的字符串,字符串要以’\0’結尾
獲取串口緩存中可用的字節數。
int serialDataAvail (int fd)
- fd:文件描述符
- 返回:串口緩存中已經接收的,可讀取的字節數,-1代表錯誤
從串口讀取一個字節數據返回。
如果串口緩存中沒有可用的數據,則會等待10秒,如果10后還有沒,返回-1
int serialGetchar (int fd)
-
fd:文件描述符
-
返回:讀取到的字符
以下為C++實現數據的接收
#include<stdio.h> #include<wiringPi.h> #include<wiringSerial.h> #include<string.h> int main(){int fd;int message;wiringPiSetup(); fd = serialOpen("/dev/ttyAMA0", 115200);serialPuts(fd, "Raspberry pi is ready\r\n");while(1){while(serialDataAvail(fd) != -1){message = serialGetchar(fd); if(message == '1' ){serialPuts(fd,"hello\r\n"); } else if (message == '2') {serialPuts(fd,"C++\r\n");} else if (message == '3'){serialPuts(fd,"!!!\r\n");}} } return 0; }參考博客:https://www.cnblogs.com/lulipro/p/5992172.html
總結
以上是生活随笔為你收集整理的Raspberry 4B 串口通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB 增删改查
- 下一篇: 使用Visual Studio Code