一、实验目的
利用陶晶驰串口屏设计软件、Kei以及STM32CubeMX软件结合硬件,完成串口屏与单片机之间的简单通信。
二、硬件连接
32单片机与串口屏连接
串口屏与电源板连接
三、使用USART HMI软件完成串口屏界面设计
3.1创建工程
1.点击新建
2. 选择保存工程的位置,并设置文件名,点击保存
3. 选择串口屏型号,在串口屏的背面可以看到屏幕的型号或者在购买订单中查找,这里选用的设备为T1系列TJC3224T124_011
4. 点击左侧的显示选项,选择一个显示方向,并点击 OK,完成工程的创建
3.2建立一个主页
3.2.1修改页面名称
这里改为main,建议使用英文名称,不建议使用中文或其他非 ascii 字符的文字。
3.2.2新建字库和导入字库
2.1点击工具-字库制作
2.2设置如下
2.3点击生成字库并保存,选择加入刚刚生成的字库
3.2.3加入按钮控件
修改按钮控件显示的文字
front值对应创建的字库,txt值是控件显示的文字,bco和pco可以分别修改背景和文字的颜色
3.3建立功能实现页面
3.3.1修改页面名称
3.3.2加入控件并编辑
t_是文本控件,b_是按钮控件,n_是数字控件
3.4编写代码
完成功能:
1.按下main界面中的b0按钮跳转到界面show_trans;
点击mian中的b0按钮,编写按钮控件的按下或弹起事件
2.按下show_trans界面的b1按钮则n1显示的数值加5,按下show_trans界面的b2按钮则n1显示的数值减5;
分别点击show_trans中的b1和b2按钮,编写按钮控件的按下或弹起事件:
3.按下show_trans界面的其他部分跳转到main界面;
点击show_trans中空白界面
4.按下show_trans界面的b0按钮向单片机发送数据;
淘晶驰没有定义固定的串口屏发送给单片机的数据格式,需要自己定义格式。
常见的通讯协议的格式如下:
帧头 + 帧长度 + 帧内容 + 帧校验 + 帧尾
我们可以根据需要定义一个通讯协议的结构如下:
帧头 + 帧内容 +帧尾
设定帧头为0a,帧尾为ff,帧内容即发送数据设为两个字节。
点击show_trans界面的b0按钮,编写按钮控件的按下或弹起事件:
编译后进行调试,检验功能有没有实现。
四、Keil编写32工程代码
4.1初始配置
使用stm32cubeMX完成以下配置,包括系统时钟,下载和串口配置。
注意串口要使能中断并设置波特率为9600;
4.2编写程序
4.2.1修改设置
点击魔法棒,Target-勾选Use Microlib,DEBUG-Setting-Flash Download-勾选Rest and run;
4.2.3在usart.c中分别重定向printf和get char,scanf函数
#include "stdio.h" int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);//HAL库串口发送函数 return ch; } int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, &ch, 1, 0xffff);//HAL库串口接收函数 return ch; }
4.2.4实现串口接收并发送数据
1.在main中第一次调用接收中断函数
/* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); /* USER CODE END 2 */
2.编写HAL_UART_RxCpltCallback中断回调函数,处理接收的数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { rx_data[rx_cnt] = rx_byte; //接收数据转存入数组 rx_cnt=rx_cnt+1; if (rx_data[rx_cnt-1] == 0xFF && rx_data[rx_cnt-4] == 0x0a) //判断接收数据的帧头帧尾 { HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); printf("show_trans.n1.val=%d\xff\xff\xff",rx_data[rx_cnt-3]+rx_data[rx_cnt-2]*256); //将收到的数据发送回串口屏 rx_cnt =0; memset(rx_data,0x00,sizeof(rx_data)); //清空数组 } HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_byte, 1);//再开启中断 }
串口屏发送的数据格式为0a _ _ _ _ ff,据此来编写判断条件
if (rx_data[rx_cnt-1] == 0xFF && rx_data[rx_cnt-4] == 0x0a) //判断接收数据的帧头帧尾
注意:0a所在字节后第一个字节为低位,第二个字节为高位。
向串口屏发送数据
printf("show_trans.n1.val=%d\xff\xff\xff",rx_data[rx_cnt-3]+rx_data[rx_cnt-2]*256); //将收到的数据发送回串口屏