串口屏发送数据给单片机

定义发送的数据格式

淘晶驰没有定义固定的串口屏发送给单片机的数据格式,您需要自己定义格式

其原理相当于在串口屏上实现屏幕上的主动解析

我们需要先定义一个符合我们需求的通讯协议

常见的通讯协议的格式如下

帧头 + 帧长度 + 帧内容 + 帧校验 + 帧尾

上面的格式中有些事可以被省略掉的,例如淘晶驰通讯协议是 帧内容 + 帧尾(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               //发送帧尾
../../_images/tjc2mcu_1.jpg

《串口屏发送数据给单片机例程》下载

演示工程下载链接:

《led状态下发》演示工程下载

《串口下发用户名和密码》演示工程下载

单片机如何解析串口屏发出的数据

请参考 使用stm32cubeide(HAL库)开发