工具下載
虛擬串口工具
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:
- 完整Unicode表:https://unicode-table.com/cn/blocks/
- 字符和十進制范圍:https://weiyinfu.cn/Unicode/standard.html
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