上一次我们完成了HMI串口显示屏幕的布局工作,我们将布局后的文件烧录到了显示屏幕上,下面是刚刚烧录完程序的显示屏上电后的效果。
翻页与问询命令
可以看到刚刚下载完程序后,屏幕上显示的时page0,我们切换到page1页面需要一条命令 dp=1 ,注意所有的命令都是字符串的形式,同时每一条命令后面都要有三个16进制的0xff作为结尾,我们可以使用串口助手进行调试,首先关闭串口助手的十六进制显示功和能,在发送去写入dp=1,然后将它切换为十六进制显示模式,在发送区的十六进制码后边在写入ffffff,然后不要关闭十六进制来发送这条命令,这时屏幕就会切换到page1去,翻页的命令还可以使page 1 来翻到page1这个页面去,同样后边也需要加上三个0xff作为结尾,后边我们讲到的所有命令都默认以十六进制的0xff结尾。
有一件事我们要注意,有时执行翻页命令后可能有屏幕没有收到命令的情况,而如果我们发送了dp=1,但屏幕没有切换到page1我们又发送了针对page1的其他命令,就很可能导致屏幕发生混乱,所以我们在用单片机控制HMI显示屏进行显示的时候,翻页命令最好和另一条命令配合使用,这条命令就是readme命令,发送readme命令后,屏幕会返回5个16进制码:0x66 页码(hex) 0xff 0xff 0xff。
其中这五个数的第二个就是当前的页码值,我们在发送完翻页命令后,最好再发送一个readme命令,等到HMI屏幕返回给你的页面值与你的目标页面值一致的时候再执行其他相关操作。
控件属性
这个界面有三个控件,这三个控件自上而下分别是t0、t1、t2,我们要控制的是t1、t2这两个控件,我们要控制这两个控件的背景,文字内容,使用的字库(注意:控件的大小和位置是不能通过串口来控制的)
控制控件的背景:我们在这里控制背景是为制作光标选中的效果,我们首先将深色图片的控件的背景改变为背景图片:发送t1.picc=0。然后在发送t2.picc=2。这样这样就交换了上下两个控件的背景图片,形成了光标移动的效果。
控制控件的内容:控制控件的内容来时温度值与湿度值可以跟随传感器采集的数值实时变化,如果我们要将温度值改为23℃,只需要发送t1.txt=”温度:23℃”,这样控件t1的温度值就会变为23℃,记住不要命令里使用的双引号是半角字符。
字库的灵活用法:我们在布局页面的时候,建了两个字库,一个字库的大小是1616个像素,一个字库的大小是2424个像素,小号的字库ID是1,大号的字库ID是0,如果我们想让“温度:55℃”变小:发送t1.font=1;先让t1再变大:发送t1.font=0。字库还有一种用法,就是让文字消失和出现,我们可以在布局屏幕的时候建立一个字库,这个字库选择指定字符生成字库,在指定字符中什么都不写,或者写入你不会用到的文字,假设这个字库的ID为3,当我们发送t1.font=3的时候,控件t1中的文字便会消失,因为当控件再所使用的字库中搜索不到你使用的文字,他就会以空白的形式出现。
改变通信波特率:
如果你想改变你所使用串口的波特率那么有两个命令:
修改当前波特率:
baud=2400/9600/19200/38400/57600/115200/230400/256000/512000/921600
修改上电默认波特率值:bauds=9600/…(支持的值同上)
格式化字符串
前边页面布局的时候为什么要统一使用文本控件呢?这是因为统一使用文本控件的话只要在程序中使用标准库函数sprintf来格式化字符串,将格式化好的字符串输出就可以了,操作得到了大大的简化。
sprintf(char*s, “ ”, 变量):这个函数的第一个参数是一个char类型的数组首地址,后边的参数与printf函数的格式相同,可以使用%d,%f,等这样的符号来将变量的值格式化为字符串形式,这个函数会返回最终生成的字符串长度,记得要在生成的字符串后边加上三个0xff。
编程的注意事项
1、发送方式:由于HMI屏幕使用的是串口通信,再HMI屏幕显示的过程中,单片机据屏幕之间会有大量的数据发送,将串口设置为DMA方式进行发送是一个不错的方法,但是使用DMA方式来发送数据有一点需要注意,就是每次发送要等到上一次DMA发送完成才可以进行这一次的发送,否则可能会造成DMA发送的数据产生混乱。有一个方法可以实现这一个功能,并且不用一直等待DMA发送完成。我们可以定义一个标志位(这个标志位一定要用volatile进行声明),每次DMA发送完成,便会产生一个串口发送完成中断,可以在这个中断里将这个标志位置一,来标志发送已经完成可以进行下一次发送,然后每次发送之前先要检查这个标志为是否为1,如果为1就进行新一次的发送,否则先执行其他的操作,直到这个标志位置1再进行发送。
2、翻页操作的实现:由于发送完readme命令后只有接到屏幕正确的回传后才能进行相关的屏幕操作,所以我们需要使用串口接收中断,hal库中有这个函数HAL_UART_Receive_IT可以开启串口中断接收,但是有一点需要注意,当中断发生时需要在串口中断接收完成回调函数中再次调用这个函数否则中断就会关闭。发送完readme命令后可以先执行其他与屏幕无关的操作,当接收完成时,判断屏幕的当前页面是否与目标页面一致,若不一致则再次执行翻页操作,若一致则可以执行与页面相关的其他操作。
上边讲到的就是在这个项目中用到的相关操作,如果需要使用其他功能可以进行下边的操作:点击“关于”–> 关于USART HMI,会出现下面的界面。
点击左下角的USART HMI 资料中心 即可查看到HMI屏幕的更到操作。