文章目錄
- 一、序列槽通信的一些概念
- 二、樹莓派序列槽通信設定
- 三、樹莓派序列槽通信API
- 四、樹莓派與PC通信
-
- 1.接線
- 2.程式與測試
- 拓展
一、序列槽通信的一些概念
序列槽通信通常用在多機通信中。
序列槽通信是全雙工的,那什麼是全雙工呢?
打個比方,一男一女在電話争吵,雙方都能同時說話,對方也都能聽到。
序列槽通信有兩根資料線:Rx Tx
比如樹莓派要和51單片機通信,将樹莓派的R接到51的T,樹莓派的T接到51的R(當然還要供電,就不啰嗦了)。就可以實作樹莓派和單片機的互動了,雙方都可以收發資料。當然你也可以隻接一根,就變成單工了,隻允許資料單向流動。
序列槽通信的雙方必須要遵循特定的序列槽通信協定才能實作雙方資料收發,就像兩個人對話一樣,語言相通,語速一緻,才能實作對話。
在序列槽通信中,語言可以了解為資料格式(資料位、停止位、奇偶校驗位),語速可以了解為波特率。
以上在序列槽通信的面試中已經足夠了
二、樹莓派序列槽通信設定
這一步是很重要的,因為樹莓派3b的序列槽預設是被藍牙占用的,也就會預設是用于藍牙的。
但在前面的學習中,我們對樹莓派的序列槽進行過一次設定或者說配置,就是解除了序列槽的藍牙占用,用于序列槽登入,通過序列槽列印一些系統初始化的資訊。
現在需要再次修改配置資訊,來設定用于序列槽通信。配置方法如下:
①進入該目錄 /boot/,打開cmdline.txt檔案
cd /boot/
sudo vi cmdline.txt
進入該檔案後,删除紅色方框内容

删除後儲存退出,删除後為:
②重新開機
sudo reboot
三、樹莓派序列槽通信API
用到序列槽通信API需要包含頭檔案:
序列槽常見的API參考文章:樹莓派wiringPi庫詳解
四、樹莓派與PC通信
将樹莓派與電腦進行連接配接,測試一下樹莓派與電腦的序列槽通信。
1.接線
TTL與樹莓派TX,RX連接配接後插入電腦端口,注意是交叉接線,最後TTL與樹莓派還要共地穩壓,保證資料正常溝通。一共三根線,Rx ——Tx、Tx——Rx、GND——GND。最後别忘記給樹莓派供電哦!
2.程式與測試
我們要實作的功能是樹莓派與電腦的雙工通信,也就是樹莓派向PC發送資料,看PC是否接收到;PC向樹莓派發送資料,看樹莓派是否接收到。我們可以通過序列槽助手來檢視樹莓派發上來的資料以及模拟發送資料給樹莓派。
①樹莓派通過序列槽發送資料給PC
程式如下:
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
int main()
{
int fd;
if(wiringPiSetup() == -1)
{
printf("硬體初始化失敗\n");
}
fd = serialOpen("/dev/ttyAMA0",9600); //Linux下一切皆檔案
while(1)
{
serialPutchar(fd,'c');
//serialPuts(fd,"Hello World!\n");
delayMicroseconds(1000000); //延時函數
}
return 0;
}
我們在PC端打開序列槽調試助手,注意選對端口,波特率與程式中設定的一緻。
結果如下:
每隔一秒鐘通過序列槽向PC段發送一個字元 ‘c’
②PC通過序列槽發送資料發送給樹莓派
程式如下:
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
int main()
{
int fd;
int cmd;
if(wiringPiSetup() == -1)
{
printf("硬體初始化失敗\n");
}
fd = serialOpen("/dev/ttyAMA0",9600);
while(1)
{
while(serialDataAvail(fd) != -1){
cmd = serialGetchar(fd); //讀序列槽資料
printf("get data is %d\n",cmd);
}
}
return 0;
}
結果如下:
我們通過序列槽調試助手發送整型數 5
樹莓派接收到的資料也是 5
③樹莓派與PC互動
程式:
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
int main()
{
int fd;
int cmd;
if(wiringPiSetup() == -1)
{
printf("硬體初始化失敗\n");
}
fd = serialOpen("/dev/ttyAMA0",9600); //打開序列槽
while(1)
{
while(serialDataAvail(fd) != -1)
{
cmd = serialGetchar(fd);
if(cmd == '2')
{
serialPuts(fd,"Pi receive 2 from you!\n");
}
if(cmd == '3')
{
serialPuts(fd,"Pi receive 3 from you!\n");
}
if(cmd == '4')
{
serialPuts(fd,"Pi receive 4 from you!\n");
}
}
}
return 0;
}
結果如下:
後續我們可以将樹莓派與語音子產品結合起來,将語音子產品擷取的指令通過序列槽發送給樹莓派,樹莓派根據不同的指令執行不同的操作。
拓展
通過這一節對序列槽通信的學習,對序列槽通信有了一定了解。由此可以進行拓展,為後面智能家居項目服務。
樹莓派與語音子產品的序列槽通信,實作語音控制各種燈或其它裝置:
語音子產品接收到指令後通過序列槽向樹莓派發送相關資料,樹莓派根據接收到的資料,選擇進行不同到的動作,進而實作對不同裝置的控制。目前,樹莓派也可以通過序列槽連接配接51或者32,将接收到的資料(指令)轉發給單片機,單片機根據不同的指令去進行不同的動作。
參考文章:
樹莓派wiringPi庫詳解
樹莓派序列槽通信