张高兴的 .NET Core IoT 入门指南:(五)串口通信入门
在開始之前,首先要說明的是串口通信所用到的?SerialPort?類并不包含在?System.Device.Gpio?NuGet 包中,而是在?System.IO.Ports?NuGet 包中。之所以在這里介紹串口通信,是因為在嵌入式中串口通信是與其他設(shè)備進行交互的一種重要方式,而且在某些沒有屏幕的設(shè)備中充當著程序調(diào)試的工具。
什么是串口
串口是串行接口的簡稱,這是一個非常大的概念,在嵌入式中串口通常指 UART (Universal Asynchronous Receiver/Transmitter,通用異步收發(fā)器)。使用串口進行的通信叫做串行通信,與之相對的一個概念是并行通信。串行通信是指數(shù)據(jù)一位一位的按順序傳輸,而并行通信則是多位數(shù)據(jù)同時傳輸。如圖1所示,DATA BUS?到?UART 1?之間是并行通信,UART 1?到?UART 2?之間是串行通信。
圖1:串行通信與并行通信
串口通信的數(shù)據(jù)幀格式如圖2所示,通常一幀共包括 10 位:1 個起始位,8 個數(shù)據(jù)位和 1 個停止位。有一些特殊的數(shù)據(jù)幀在停止位前面包含 1 位的奇偶校驗位,還有的停止位有 2 個比特。其中起始位為低電平(0),標志著數(shù)據(jù)傳輸?shù)拈_始;停止位為高電平(1),表示數(shù)據(jù)幀傳輸結(jié)束;數(shù)據(jù)位則為實際發(fā)送的數(shù)據(jù),使用高低電平來表示比特信息,如果發(fā)送的內(nèi)容是文本,那么這段數(shù)據(jù)為字符的二進制編碼(ASCII,UTF-8……)。數(shù)據(jù)傳輸?shù)乃俾饰覀兪褂?strong>波特率(Baud Rate)來表示,即每秒鐘傳送的碼元符號的個數(shù)[1]。比如數(shù)據(jù)傳輸速率為 9600 字符/s,那么這時的波特率為 9600。
圖2:串口通信的數(shù)據(jù)幀
設(shè)備進行串口通信時,設(shè)備的連線如圖3所示,兩個設(shè)備的信號線,即發(fā)送端(TXD)與接收端(RXD)交叉相連,并且需要共地。在 Raspberry Pi 的引腳上共引出了 1 組串口,即?UART 0?,對應 8 和 10 號引腳。
圖3:串口設(shè)備的連接
相關(guān)類
串口操作的相關(guān)類位于?System.IO.Ports?命名空間下。
SerialPort
public class SerialPort : Component {// portName 為串口的名稱,可以使用靜態(tài)方法 GetPortNames() 獲取public SerialPort(string portName);// 傳輸?shù)牟ㄌ芈蕄ublic int BaudRate { get; set; }// 指定傳輸內(nèi)容的編碼public Encoding Encoding { get; set; }// 新行格式,即設(shè)置換行的字符public string NewLine { get; set; }// 設(shè)置停止位的格式public StopBits StopBits { get; set; }// 設(shè)置校驗位的格式public Parity Parity { get; set; }// 打開串口通信流public void Open();// 關(guān)閉串口通信流public void Close();// 向串口通信流中寫一行字符public void WriteLine(string text);// 從串口通信流中讀一行字符public string ReadLine();// 讀取緩沖區(qū)中的所有可用內(nèi)容,一般用于清空緩沖區(qū),防止讀取舊的內(nèi)容public string ReadExisting();// 獲取可用的串口名稱public static string[] GetPortNames(); }串口通信的步驟
配置串口通信參數(shù),如波特率,內(nèi)容編碼,新行格式,超時時間等。
打開串口
讀取和寫入文本
關(guān)閉串口
USB 串口通信實驗
硬件需求
| USB 串口 | x1 |
| 杜邦線 | 若干 |
USB 串口設(shè)備只要 Raspberry Pi 支持即可,這里使用的是?FT232RL。
電路
GND - GND
RX - TX (Pin 8)
TX - RX (Pin 10)
USB - USB
使用 Docker 運行示例
示例地址:https://github.com/ZhangGaoxing/dotnet-core-iot-demo/tree/master/src/SerialCommunication
docker build -t serial-sample -f Dockerfile . docker run --rm -it --device /dev/ttyUSB0 --device /dev/ttyS0 serial-sample代碼
打開 Visual Studio ,新建一個 .NET Core 控制臺應用程序,項目名稱為“SerialCommunication”。
引入?System.IO.Ports?NuGet 包。
在?Program.cs?中,將主函數(shù)代碼替換如下:
發(fā)布、拷貝、更改權(quán)限、運行
效果圖
??備注
下一篇文章將談?wù)?Iot.Device.Bindings NuGet 包的使用。
總結(jié)
以上是生活随笔為你收集整理的张高兴的 .NET Core IoT 入门指南:(五)串口通信入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中Array.Sort()方法分析
- 下一篇: 1024程序员节来啦!!.NET技术圈独