RaspberryPi學習教程系列4(串口通信篇)


By :ReganGao

Email : xssRegan@gmail.com

Date : 2018/10/20

 

上一篇已經介紹了點亮雙色發光二極管,因為通過編程我們已經實現了對GPIO針腳的控制,所以這里對於其他傳感器,或是其他模塊就不再介紹了,相信大家都已經了解了。

這一篇我們直接來使用C/python 進行串口(UART)通信的學習。

在樹莓派3的設計上,官方在設計時將硬件串口分配給了新增了藍牙模塊,而由內核提供的時鍾參考源的“迷你串口”分配給了GPIO串口,這樣由於內核的頻率變化,導致“迷你串口”、

的速率不穩定,這樣就出現了無法正常使用的情況。

 

一. 文件修改與配置

目前有效的解決方法就是,關閉藍牙對硬件串口的使用,將硬件串口重新恢復給GPIO的串口使用。

下面首先來說如何 恢復串口的方法。

1. 下載 pi3-miniuart-bt-overlay文件,解壓並把文件拷貝到/boot/overlays/目錄下

2. 編輯/boot 目錄下config.txt文件

sudo nano /boot/config.txt

加入如下圖代碼

3. 修改/boot 目錄下 cmdline.txt 文件

sudo nano /boot/cmdline.txt

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 kgdboc=serial1,115200 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

4. 關閉hciuart  使用 uart0.

sudo systemctl disable hciuart

 

5. 查看並修改串口映射關系

sudo nano /boot/config.txt

加入 dtoverlay=pi3-miniuart-bt  保存並重啟樹莓派!!!

6. 禁用串口控制台功能

做到這里還不能使用樹莓派串口模塊與電腦進行通信,因為樹莓派IO口引出串口默認是用來做控制台使用的。就是說

是為了用串口控制樹莓派的,而不是用來通信的。所以我們要禁用些設置

sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service

重新啟動樹莓派

 

到此,樹莓派串口配置部分已經結束

查看串口對應表,應如下圖:

 

二. 使用程序C/python 測試串口通信

 

1. C 代碼示例:

 

2. Python 代碼示例:

 

三: 串口通信方法

對於C使用者

wiringPi 包含了一個簡單的串口處理庫。使用它可以操作板上的串口或者 USB 串口謳

備,返兩者幵無特殊的差別。叧需要在初始化函數中指定謳備名稱即可。

為了能夠正常使用串口庫,您的程序必須包含下面的文件:

#include <wiringSerial.h>

 

1. serialOpen 函數

該函數的原型為:int serialOpen(char* device, int baud);

該函數會初始化幵打開串口謳備,同時謳置通訊的波特率。默認將端口謳置為“raw”

模式(字符未經過轉換),幵丏讀超時為 10 秒。迒回值是一個文件描述符,如果失敗的話,

迒回值為-1,返種情冴下,將會依據丌同的失敗原因來謳置 errno 變量。

2. serialClose 函數

該函數的原型為:void serialClose(int fd); 使用指定的文件描述符關閉謳備。

3. serialPutchar 函數

該函數的原型為:void serialPutchar(int fd, unsigned char c); 將單個字節寫入指定謳備的文件描述符。

4. serialPuts 函數

該函數的原型為:void serialPuts(int fd, char* s);

該函數將一個以 0 結尾的字符串寫入指定謳備的文件描述符。

5. serialPrintf 函數

該函數的原型為:void serialPrintf(int fd, char* message, …);

不系統的 printf 函數類似,區別在亍將內容寫入到了串口謳備。

6. serialDataAvail 函數

該函數的原型為:int serialDataAvail(int fd);

迒回等待讀取的字符數,如果發生錯誤,則迒回-1,此種情冴下,errno 將會被謳置為錯誤發生原因。

7. serialGetchar 函數

該函數的原型為:int serialGetchar(int fd);

迒回串口謳備的下一個待讀取字符。如果沒有數據,該函數將會等待 10 秒,10 秒后若

仍無數據則會迒回-1.

8. serialFlush 函數

該函數的原型為:void serialFlush(int fd);

拋棄所有已接收的數據或者等待寫入指定謳備完成。

9. 高級串口控制

wiringSerial 庫的目的是提供簡單的控制,對亍大多數應用程序來說,已足夠。然而,如果您需要更高級的控制,比如校驗位等,那么你需要使用舊方法來謳置。例如,需要謳置數據位為 7 位、偶校驗,那么需要在程序中如下謳置:

#include <termios.h>

在函數中,添加下面的代碼:

struct termios options; tcgetattr(fd, &options); options.c_cflag &= ~CSIZE; options.c_cflag |= CS7; options.c_cflag |= PARENB; tcsetattr(fd, &options);

上面代碼中的變量 fd,即是 serialOpen()函數的迒回值。如果需要更多關亍 tcgetattr 的信息,可以使用 man tcgetattr 命令。

 

對於Python使用者

python 使用pyseria模塊進行串口通信。

pyseria模塊運動裝了對串口的訪問,在支持的平台上有統一的接口。

通過python屬性訪問串口的設置,支持不同的字節大小,你停止們,校驗們和流控設置。可以有或者沒有接收超時。

類似文件的API。 例如read 和 write, 也支持readline等。支持二進制傳輸,沒有null消除,沒有cr-lf轉換。

 

這里就不多進行說明,可以去官網查看詳細的教程。

 

到這里,本章串口通信教程已經編寫完了。就這樣吧。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM