go學習(六)串口編程


工具下載

虛擬串口工具

Virtual Serial Port Driver Pro(虛擬串口工具) v6.9漢化破解版[http://www.xue51.com/soft/9349.html]

串口調試助手

Serial Port Utility(友善串口調試助手5.0)[https://www.onlinedown.net/soft/261875.htm]

打開,選擇默認存儲配置數據文件夾:C:/Users/nix3he/AppData/Roaming/ALITHON/SerialPortUtility/Config

打開兩個,一個監控發送串口,一個監控接受串口。

串口知識

參考視頻:什么是串口,端口,引腳? - 想啥做啥的回答 - 知乎 [https://www.zhihu.com/question/421382950/answer/1902314669]

並行通信

優點:速度快,一次可以進行多位數據同時傳輸

缺點:傳輸n位數據需要n條導線,遠距離傳輸鋪設線路成本高

串行通信:USRT和UART

USRT(Universal Synchronous Receiver/Transmitter),同步串行通信。有clock用於同步。

UART(Universal Asynchronous Receiver/Transmitter),異步串行通信。

(1)沒有clock同步,設置波特率baud rate進行同步。

發送方與接收方設置同樣的波特率即傳輸速度,例如,常用的115200bps代表每秒鍾發送115200個bit,也就是每隔1/115200=8.68微秒就讀一個bit。需要兩邊事先約定好一樣的速度發送和接收才能正常,如果你用9600bps的速度接收115200bps發送的信號,則什么都不會收到。

(2)什么時候開始接收數據?

起始位,start bit。

UART總線在沒有傳輸數據時是高電平狀態,起始位一來,UART總線電壓就會變低電平,當接收端檢測到起始位低電壓就知道有數據要傳過來了。假設我們要透傳UART以115200,8,N,1的模式傳輸一個內容是0x3A的字節,波形如下:0x

115200,8,N,1
“115200”表示通信波特率為 115200,
// 串口通信中通常使用的是異步串口通信,既沒有時鍾線,所以兩個設備要通信,必須要保持一致的波特率,當然,波特率常用值還有 4800、115200 等。
“N”表示的是無校驗位,8”表示的是數據位數為 8 位,
“1”表示的是 1 位停止位。
// 串口通訊的一個數據包從起始信號開始,直到停止信號結束。數據包的起始信號由一個邏輯 0 的數據位表示,而數據包的停止信號可由 0.5、 1、 1.5 或 2 個邏輯 1 的數據位表示,只要雙方約定一致即可。

串口和並口

串行接口,簡稱串口,也就是COM接口,是采用串行通信協議的擴展接口。串口的出現是在1980年前后,數據傳輸率是115kbps~230kbps,串口一般用來連接鼠標和外置Modem以及老式攝像頭和寫字板等設備,目前部分新主板已開始取消該接口。

並行接口,簡稱並口,也就是LPT接口,是采用並行通信協議的擴展接口。並口的數據傳輸率比串口快8倍,標准並口的數據傳輸率為1Mbps,一般用來連接打印機、掃描儀等。所以並口又被稱為打印口。

串口通信基礎知識

多協程

字符編碼

字符集 vs 字符編碼

參考:
https://blog.csdn.net/softwarenb/article/details/51994943
https://www.cnblogs.com/wjhlinux/articles/11096142.html

十六進制串---編碼方案--->字符---集合起來賦予意義--->字符集

一個字符集可以由不同的編碼方案編碼,但是一般來說,名稱中帶編碼方案的字符集是和編碼方案一起制定的,基本就用這種編碼方案了。

常見字符集:ASCII、ISO 8859、GB2312、BIG5、GB18030、Unicode

編碼方案:ASCII、GB2321、GBK、Unicode、UTF-8

編碼方案 制定時間 特點
ASCII 1967年 西歐編碼的方式,
7bit,可表示128個字符,
包括34個字符(如換行LF、回車CR等),其余94位為英文字母和標點符號及運算符號等。
可打印的有95個,而不可打印的字符有33個。
GB2312 1980年 是對 ASCII 的中文擴展。
兼容ASCII,編碼小於127的字符與ASCII編碼相同
0-127是1字節,128-65535是2字節。英文均為1Byte,中文均為2Byte。
2個字節表示的漢字,前面的一個字節(稱之為高字節)從0xA1用到0xF7,后面一個字節(低字節)從0xA1到0xFE,可以組合出大約7000多個簡體漢字。【不明白為啥是這個范圍?】
GBK 1995年 是對GB2312的擴展。
兼容ASCII和GB2312。
GBK 包括了 GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。
只要第一個字節是大於127就固定表示這是一個漢字的開始,不管后面跟的是不是擴展字符集里的內容。結果擴展之后的編碼方案被稱為 “GBK” 標准,GBK 包括了 GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。
Unicode 1991年 是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。
目前的Unicode字符分為17組編排,0x0000至0x10FFFF,每組稱為平面(Plane),而每平面擁有65536個碼位,共1114112個。然而目前只用了少數平面。UTF-8、UTF-16、UTF-32都是將數字轉換到程序數據的編碼方案。【1114112=17*65536的話,應該是0x11FFFF吧?奧,0也算,共17個,所以編碼是016即0x000x10,因此是0x000000~0x10FFFF。】
UTF-8 1992年 以字節為單位對Unicode進行編碼。
UTF-8對不同范圍的字符使用不同長度的編碼:對於0x00-0x7F之間的字符,UTF-8編碼與ASCII編碼完全相同。英文是1Byte,中文是3Byte,emoji是4Byte。
UTF-8編碼的最大長度是6個字節。從上表可以看出,6字節模板有31個x,即可以容納31位二進制數字。Unicode的最大碼位0x7FFFFFFF也只有31位。

碼表

GBK:http://ff.163.com/newflyff/gbk-list/
Unicode:

ASCII的34個操作符(如換行LF、回車CR等)有哪些?ASCII的33個不可打印字符有哪些?二者區別

34:0-31(控制字符), 32(space)和127(del)
33:0-31(控制字符)和127(del)【區別在space,不可打印,但是操作符】

GB2312如何區分連着的兩個字節是1個中文還是2個英文呢?

2個字節連在一起,如果1開頭,就是1個2字節的中文,如果是0開頭,就是2個1字節的英文。
為什么可以以最高位區分呢?因為0-127已經表示了英文的絕大部分字符,128-255是ASCII的擴展表,表示的都是極特殊的字符,一般沒什么用,所以就把最高位貢獻出來了……也就是說,GB2312表示128-255之間的字符用2字節!!!

UTF-8如何區分連着的n個字節到底是幾字節的字符呢?

同GB2312,也是看0還是1開頭,0開頭同ASCII,1開頭要連在一起。區別是,n字節的字符,第一字節以[n個1+一個0]開頭,剩下的n-1個字節均以[10]開頭。

// 單字節的字符,字節的第一位設為0,對於英語文本,UTF-8碼只占用一個字節,和ASCII碼完全相同;
// n個字節的字符(n>1),第一字節的前n位設為1,第n+1位設為0,后面字節的前兩位都設為10,這n個字節的其余空位填充該字符unicode碼,高位用0補足。
例1:“漢”字的Unicode編碼是0x6C49。0x6C49在0x0800-0xFFFF之間,使用用3字節模板了:1110xxxx 10xxxxxx 10xxxxxx。
將0x6C49寫成二進制是:0110 1100 0100 1001, 用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

有了Unicode,為什么還用UTF-8、UTF-16、UTF-32呢?

UTF 是為unicode編碼 設計 的一種 在存儲 和傳輸時節省空間的編碼方案。
Unicode是2Byte,如果要全部按照2Byte編碼的話,Unicode的英文就是ASCII的2倍,這對於存儲和傳輸來說,實在是過於浪費!
為了解決存儲和網絡傳輸的問題,出現了Unicode Transformation Format,學術名UTF,即:對unicode字符進行轉換,以便於在存儲和網絡傳輸時可以節省空間!【一切都是為了省你的內存和流量!】

  • UTF-8: 使用1、2、3、4個字節表示所有字符;優先使用1個字符、無法滿足則使增加一個字節,最多4個字節。英文占1個字節、歐洲語系占2個、東亞占3個,其它及特殊字符占4個
  • UTF-16: 使用2、4個字節表示所有字符;優先使用2個字節,否則使用4個字節表示。
  • UTF-32: 使用4個字節表示所有字符;

go的二、八、十六進制表示

只要以0(0b或0或0x)開頭,就按照2/8/16進制處理。不以0開頭,均為10進制。

  • 0b開頭是二進制,只能出現0~1。不能有2-9和字母。

  • 0開頭是八進制,只能出現0-7。不能有8-9和字母。

  • 0x開頭是十六進制,只能出現0-f。不能有f之后的字母。

  • 不以0開頭的是十進制,只能出現0-9。不能有字母。

go編碼方案:byte vs rune

https://www.cnblogs.com/sybil-hxl/p/15776455.html

byte 等同於int8,即1個字節長度,常用來處理ascii字符。若用來表示utf-8
rune 等同於int32,即4個字節長度,常用來處理unicode或utf-8字符

  • utf-8:英文是1Byte,中文是3Byte,emoji是4Byte。golang默認編碼正好是utf-8。
  • unicode:英文是1Byte,中文是2Byte。

串口教程

go_serial安裝

go_serial的git地址:https://github.com/tarm/serial

下載下來,vscode打開。發現報紅,執行以下命令。

// 安裝代理
go env -w GOPROXY=https://goproxy.cn,direct
// 開啟GO111MODULE,【沒用,好像新版本沒必要了】
// go env -w -GO111MODULE=on

// 安裝mod,生成go.mod文件
go mod init 項目名
// 創建vendor目錄存放並下載依賴,自動生成vendor文件夾,地下是所有依賴
go mod vendor

// 安裝serial,【有mod vendor自動安裝,這步也沒必要了】
// go get github.com/tarm/serial

go_serial方法說明

go_serial使用案例


免責聲明!

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



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