串口屏发送数据给单片机
定义发送的数据格式
淘晶驰没有定义固定的串口屏发送给单片机的数据格式,您需要自己定义格式
其原理相当于在串口屏上实现屏幕上的主动解析
我们需要先定义一个符合我们需求的通讯协议
常见的通讯协议的格式如下
帧头 + 帧长度 + 帧内容 + 帧校验 + 帧尾
上面的格式中有些事可以被省略掉的,例如淘晶驰通讯协议是 帧内容 + 帧尾(3个0xff)
具体需要哪些格式,不需要哪些格式,取决于项目的具体需求
假设使用串口屏控制4个led灯,串口屏需要下发的参数为灯的状态(开或关)
通讯协议举例(帧头 + 帧内容 + 帧尾):
当我们做汇报时,要先喊一声“报告!”,提醒其他人我们要开始说话了,这个相当于帧头
接下来我们开始说话,这个相当于帧内容
说完后,我们说一句“完毕!”,提醒大家我们说完了,这个相当于帧尾
这就是我们定义的一个通讯协议的结构,即“帧头 + 帧内容 + 帧尾”
下发数值格式的数据
我们以此结构来传输led数据
备注:4个led用双态按钮来实现,led关闭时,对应的val属性是0,led开启时,对应的val属性是1。
帧头为 55
帧尾为 ff ff ff
//发出的数据如下
55 01 00 ff ff ff //含义:1号led关闭
55 04 01 ff ff ff //含义:4号led打开
55 01 01 ff ff ff //含义:1号led打开
55 04 00 ff ff ff //含义:4号led关闭
代码示例:
//发送1号灯状态
printh 55 01 //发送帧头和灯的编号
prints led1.val,1 //发送led1的数据,长度1字节
printh ff ff ff //发送帧尾
//发送2号灯状态
printh 55 02 //发送帧头和灯的编号
prints led2.val,1 //发送led2的数据,长度1字节
printh ff ff ff //发送帧尾
//发送3号灯状态
printh 55 03 //发送帧头和灯的编号
prints led3.val,1 //发送led3的数据,长度1字节
printh ff ff ff //发送帧尾
//发送4号灯状态
printh 55 04 //发送帧头和灯的编号
prints led4.val,1 //发送led4的数据,长度1字节
printh ff ff ff //发送帧尾
也可以一次性下发4个灯的状态
55 01 01 01 01 ff ff ff //含义:4个灯状态分别为:开、开、开、开
55 00 00 00 00 ff ff ff //含义:4个灯状态分别为:关、关、关、关
55 00 01 00 01 ff ff ff //含义:4个灯状态分别为:关、开、关、开
55 01 00 01 00 ff ff ff //含义:4个灯状态分别为:开、关、开、关
代码示例:
//一次性下发4个灯的状态
printh 55 //发送帧头
prints led1.val,1 //发送led1的数据,长度1字节
prints led2.val,1 //发送led2的数据,长度1字节
prints led3.val,1 //发送led3的数据,长度1字节
prints led4.val,1 //发送led4的数据,长度1字节
printh ff ff ff //发送帧尾
这里的帧头或者帧尾你可以改为其他你想要的,例如帧头改为0x33,帧尾用0d 0a(即回车换行)取代3个0xff
33 01 01 01 01 0d 0a //含义:4个灯状态分别为:开、开、开、开
代码示例:
//一次性下发4个灯的状态
printh 33 //发送帧头
prints led1.val,1 //发送led1的数据,长度1字节
prints led2.val,1 //发送led2的数据,长度1字节
prints led3.val,1 //发送led3的数据,长度1字节
prints led4.val,1 //发送led4的数据,长度1字节
printh 0d 0a //发送帧尾
也可以去掉帧头或者帧尾
1、去掉帧头
01 01 01 01 0d 0a //含义:4个灯状态分别为:开、开、开、开
代码示例:
//一次性下发4个灯的状态
prints led1.val,1 //发送led1的数据,长度1字节
prints led2.val,1 //发送led2的数据,长度1字节
prints led3.val,1 //发送led3的数据,长度1字节
prints led4.val,1 //发送led4的数据,长度1字节
printh 0d 0a //发送帧尾
2、去掉帧尾
33 01 01 01 01 //含义:4个灯状态分别为:开、开、开、开
代码示例:
//一次性下发4个灯的状态
printh 33 //发送帧头
prints led1.val,1 //发送led1的数据,长度1字节
prints led2.val,1 //发送led2的数据,长度1字节
prints led3.val,1 //发送led3的数据,长度1字节
prints led4.val,1 //发送led4的数据,长度1字节
3、因为每次都是固定下发4个数据,因此连帧头帧尾都不要其实问题也不大,但是存在一定的解析错误的风险
01 01 01 01 //含义:4个灯状态分别为:开、开、开、开
代码示例:
//一次性下发4个灯的状态
prints led1.val,1 //发送led1的数据,长度1字节
prints led2.val,1 //发送led2的数据,长度1字节
prints led3.val,1 //发送led3的数据,长度1字节
prints led4.val,1 //发送led4的数据,长度1字节
4、如果需要校验,可以使用modbus_crc16
33 01 01 01 01 B0 68 //含义:4个灯状态分别为:开、开、开、开,modbus_crc16校验值为 B0 68
33 00 00 00 00 20 04 //含义:4个灯状态分别为:关、关、关、关,modbus_crc16校验值为 20 04
33 00 01 00 01 B0 04 //含义:4个灯状态分别为:关、开、关、开,modbus_crc16校验值为 B0 04
33 01 00 01 00 20 68 //含义:4个灯状态分别为:开、关、开、关,modbus_crc16校验值为 20 68
代码示例:
crcrest 1,0xffff //复位crc
printh 33 //发送帧头
crcputh 33 //放入帧头
prints led1.val,1 //发送led1的数据,长度1字节
crcputs led1.val,1 //放入led1的数据,长度1字节
prints led2.val,1 //发送led2的数据,长度1字节
crcputs led2.val,1 //放入led2的数据,长度1字节
prints led3.val,1 //发送led3的数据,长度1字节
crcputs led3.val,1 //放入led3的数据,长度1字节
prints led4.val,1 //发送led4的数据,长度1字节
crcputs led4.val,1 //放入led4的数据,长度1字节
prints crcval,2 //发送crc校验结果,长度2字节
使用crc校验的步骤:
1、复位crc校验
2、放入要校验的数据,如果是printh就用crcputh,如果是prints就用crcputs
3、发送校验结果crcval,长度一定是2字节
下发字符串格式的数据
代码示例:
//发送用户名 55:帧头,01:代表下发的是用户名
printh 55 01
prints username.txt,0 //发送用户名字符串
printh 0d 0a //发送帧尾
//发送密码 55:帧头,02:代表下发的是密码
printh 55 02
prints password.txt,0 //发送password字符串
printh 0d 0a //发送帧尾
对于字符串这种长度不固定的数据,建议发送字符串长度方便单片机进行解析
代码示例:
//发送用户名 55:帧头,01:代表下发的是用户名
printh 55 01
btlen username.txt,sys0 //检测字符串长度并放入sys0
prints sys0,1 //下发1字节的字符串长度,可以表示0-255个字节,在大部分场景下都是适用的
prints username.txt,0 //发送username字符串
printh 0d 0a //发送帧尾
//发送密码 55:帧头,02:代表下发的是密码
printh 55 02
btlen password.txt,sys0 //检测字符串长度并放入sys0
prints sys0,1 //下发1字节的字符串长度,可以表示0-255个字节,在大部分场景下都是适用的
prints password.txt,0 //发送password字符串
printh 0d 0a //发送帧尾
《串口屏发送数据给单片机例程》下载
演示工程下载链接: