1. 程式人生 > >樹莓派-wiringPi-UART串列埠

樹莓派-wiringPi-UART串列埠

前面介紹了python操作串列埠的方法,是通過通用的串列埠庫實現的。
用c語言當然也可以通過通用串列埠介面實現,而wiringPi也提供了自己的一套串列埠操作函式,可以很方便地操作串列埠。
事實上,wiringPi就是在上層利用通用串列埠操作介面,封裝了一套自己的庫函式。

概述

在前面python串列埠程式設計處就介紹了,樹莓派3B的板載串列埠被藍芽佔用,但可以方便地使用USB串列埠模組。

樹莓派的板載串列埠是給系統登入使用的,我們要先把這個功能關掉。
sudo raspi-config
Advanced Options –> Serial –> 關閉串列埠 –> 重啟

樹莓派上有兩個串列埠,一個硬體串列埠,工作穩定,但是分配給了藍芽;還有一個“mini-uart”,這個串列埠的時鐘是由核心提供,所以不太穩定 。 在樹莓派3B上,藍芽和硬體串列埠是不能兼得。
這個連結(http://ukonline2000.com/?p=880)有介紹如何把硬體串列埠分配到GPIO14、GPIO15上,這裡不做介紹了。

總之,在樹莓派3B上,想要使用板載硬體串列埠是比較麻煩的,我們這裡使用的是USB轉串列埠模組,也能很方便地使用串列埠。

0、包含標頭檔案

#include <wiringSerial.h>

1、開啟串列埠

<fd> = serialOpen(char* device, int buad);


【功能】
開啟串列埠檔案,並設定波特率,返回檔案編號。
【輸入】

*device 裝置路徑的字串。比如 “/dev/ttyUSB0”
buad 波特率,是一個數值。可以設定為:2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200

【輸出】一個檔案編號,代表這個串列埠裝置檔案,後面對這個串列埠的操作都會用到。
【說明】
1、wiringPi提供的設定(以及後面的讀寫功能)是簡化的檔案操作,可以滿足大部分需求。
2、這裡的是標準的linux檔案描述符,可以使用linux標準的檔案操作函式write()、read()等來操作。

後面也會有說明,wiringPi提供的讀寫功能是簡化的,不提供二進位制數值讀寫,但是可以使用linux標準的讀寫函式來操作。

2、寫入(傳送)

void serialPutchar(int fd, unsigned char c) ;
【功能】傳送一個位元組資料。
【輸入】
fd是開啟串列埠時的檔案描述符。
輸入的就是一個位元組資料,可以用字元表示,也可以用十六進位制數表示。

void serialPuts(int fd, char *s) ;
【功能】傳送字串。
【輸入】
fd是開啟串列埠時的檔案描述符。
*s 是一個字串,會發送該字串,直到’\0’結束。‘\0’不會發送出去。

void serialPrintf(int fd, char *message, …) ;
【功能】功能類似於printf,可以同時傳送多個字串。

注意:以上兩個傳送函式只是把資料推送到傳送緩衝區裡,不會等待串列埠傳送完成。後續程式如果要用到用到串列埠返回資料應當要考慮到串列埠傳輸時間。
並且最好等之前的資料全部發送完成後再發送新資料,否則可能會出問題,這也要考慮到串列埠傳送資料的時間,可能需要等待。
關鍵是上層還沒有找到判斷串列埠傳送完成的方法。

3、讀取(接收)

int serialDataAvail(int fd) ;
【功能】獲取接收緩衝區裡的位元組數。
【輸入】建立串列埠裝置檔案時的檔案描述符。
【輸出】接收緩衝區裡所存放的資料位元組數。

int serialGetchar(int fd) ;
【功能】從接收緩衝區裡讀取一個位元組資料。
【輸入】建立串列埠裝置檔案時的檔案描述符。
【輸出】讀取到的一個位元組內容。雖然是一個位元組內容,但仍然定義為了int型。
【說明】
如果緩衝區裡沒有資料,則會等待10s,相當於python裡把timeout設定為10s。
10s過後如果還沒有資料的話,則會返回 -1,十六進位制顯示為 0xffffffff。
 這裡的10s是wiringPi預設的,檢視原始碼可以看到:
1.png

4、緩衝區操作

void serialFlush(int fd) ;
清空緩衝區,放棄所有資料。

5、關閉串列埠

void serialClose(int fd) ;