程序移植
-
打开项目文件夹的以下路径:keil5_STM32\STM32\DCDEMO7\src,把cmd_queue.c、hmi_driver.c,两个C文件复制到你的项目里;再打开:keil5_STM32\STM32\DCDEMO7\inc,把cmd_process.h、cmd_queue.h、hmi_driver.h,三个头文件复制到你的项目里
cmd_queue.c文件其实就是个自己写的FIFO函数,包括清除缓存、取缓存数据。而hmi_driver.c文件里存放了所有跟串口屏数据交互的函数,例如画面切换、控件数值更新等等,全在这里面 -
修改cmd_queue.c,把19行这一句注释掉,这个ulitity.h没啥用,其对应的C文件里面重新定义了delay函数,你自己项目里有,没必要用他的,所以注释掉。
-
修改hmi_driver.h,把这两个文件里面的串口头文件改成你自己的串口
-
打开厂家例程里的hmi_user_uart.h,把这几行复制到你自己的串口头文件里(如usart3.h),这里面要注意,那句#include "stm32F10x_it.h"不要,宏定义全部都挪过去,最下面那个senchar函数,千万不要改函数名,下一步讲一下这个函数怎么修改。
5. 这个函数的作用是发送一个字节到串口屏。原函数是这样
用HAL库开发需要改成如下代码
void SendChar(uint8_t t)
{
USART6->DR=t; //根据你设置的连接串口更改数值
while((USART3->SR&0X40)==0);//等待发送结束 等待发送结束
}
进入所连串口的中断函数入口,我的是串口6
if (__HAL_UART_GET_FLAG(&huart6_handler, UART_FLAG_RXNE) != RESET) /*!< 接收非空中断 */
{
uint8_t res = huart6_handler.Instance->DR;
queue_push(res);
}
- 再主函数里面清空缓存区和使能中断
HAL_UART_Receive_IT(&huart6, (uint8_t *)cmd_buffer, CMD_MAX_SIZE);
- 在main.c文件中,添加如下引用
#include "hmi_driver.h"
#include "cmd_queue.h"
#include "cmd_process.h"
8. 到这之后我们新建一个文件对,我用Screen命名,然后添加好.c文件与.h路径,如图,并贴出.h代码
#ifndef _SCREEN_H_
#define _SCREEN_H_
#include "main.h"
#include "stdio.h"
//串口屏部分
#include "hmi_driver.h"
#include "cmd_queue.h"
#include "cmd_process.h"
//函数声明区
void ProcessMessage( PCTRL_MSG msg, uint16 size ); //消息处理流程
#endif
再打开官方例程,打开它的 main.c 文件,复制图示代码,粘贴到刚刚新建的 Screen.c 文件,注意添加 Screen.h 引用:
到此代码算移植成功
读取控件数值
官方例程
/*!
* \brief 文本控件通知
* \details 当文本通过键盘更新(或调用GetControlValue)时,执行此函数
* \details 文本控件的内容以字符串形式下发到MCU,如果文本控件内容是浮点值,
* \details 则需要在此函数中将下发字符串重新转回浮点值。
* \param screen_id 画面ID
* \param control_id 控件ID
* \param str 文本控件内容
void NotifyText(uint16 screen_id, uint16 control_id, uint8 *str)
{
if(screen_id==3)
{
int32 value=0;
sscanf(str,"%ld",&value);
if(control_id==6)
{
printf("%ld", value);
}
}
}