工具下载
虚拟串口工具
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
go_serial方法说明
go_serial使用案例
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。