工具下载

虚拟串口工具

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使用案例

posted on 2021-12-30 10:36  西伯尔  阅读(3119)  评论(0编辑  收藏  举报