2019 电子设计大赛 激光炮题目 写的程序
依赖:
usart_all.h
usart_all.c
见 STM32超级通用串口程序(秘籍)
camera.h
camera.c
见 星瞳科技 OpenMV 的使用
调用场景:
代码:
hmi.h
:
#ifndef __HMI_H
#define __HMI_H
#include "sys.h"
void HMI_sendCmdEnd(void);
void HMI_Init(void);
char HMI_GetMode(u8* mode);
char HMI_GetAngleAndDis(s16* angle, s16* dis);
void HMI_SendCmd(u8* string);
void HMI_ClearRX(void);
char HMI_CheckShootStart(void);
char HMI_CheckBack(void);
char HMI_GetCmd(u8* cmd, u8 cmd_length);
void HMI_ConfigCamera(void);
void HMI_ConfigCamera(void);
#endif
hmi.c
:
#include "hmi.h"
#include "usart_all.h"
#include "camera.h"
void HMI_Init(void) {
USART3_Init(9600);
//串口屏上电后发送三个ff,结束串口屏串口接收缓冲区的噪声命令
HMI_sendCmdEnd();
//清空单片机的和串口屏通信的接收缓冲区
USART3_ClearRXBuf();
}
//发送HMI语句结束符
//使用场景:发送命令前(擦除噪声数据) 和 发送命令后(结束本次发送的命令)
void HMI_sendCmdEnd(void) {
USART3_PutChar(0xFF);
USART3_PutChar(0xFF);
USART3_PutChar(0xFF);
}
//阻塞获得串口屏传给单片机的命令
char HMI_GetCmd(u8* cmd, u8 cmd_length) {
u8 flag_start = 0;
u8 data[cmd_length+1];
u8 i;
while(1) {
while(!USART3_GetChar(&flag_start)); //直至获得数据开头
if(flag_start == 0xAA) {
//此步超级阻塞
while(USART3_RX_Len != cmd_length+1); //直至获得所有信息数据+数据结尾
USART3_GetDatas(data, cmd_length+1);
if(data[cmd_length] != 0x55) {
return 0;
}
//接收成功
for(i=0; i<cmd_length; i++) {
*cmd = data[i];
cmd++;
}
return 1;
}
}
}
char HMI_GetMode(u8* mode) {
u8 cmd[1] = {44};
//阻塞收信息
while(1) {
while(!HMI_GetCmd(cmd, 1));
// if (cmd[0]==0 || cmd[0]==1 || cmd[0]==2 || cmd[0]==3) {
// *mode = cmd[0];
// return 1;
// }
*mode = cmd[0];
return 1;
}
}
char HMI_GetAngleAndDis(s16* angle, s16* dis) {
u8 cmd[4];
//阻塞收信息
while(1) {
while(!HMI_GetCmd(cmd, 4));
*angle = cmd[1]<<8|cmd[0];
*dis = cmd[3]<<8|cmd[2];
return 1;
}
}
void HMI_SendCmd(u8* string) {
USART3_PutStr(string);
HMI_sendCmdEnd();
}
void HMI_ClearRX(void) {
USART3_ClearRXBuf();
}
char HMI_CheckShootStart(void) {
u8 cmd[1];
//阻塞收信息
while(1) {
while(!HMI_GetCmd(cmd, 1));
if(cmd[0] == 0x66) {
return 1;
}
}
}
char HMI_CheckBack(void) {
u8 cmd[1];
//阻塞收信息
while(1) {
while(!HMI_GetCmd(cmd, 1));
if(cmd[0] == 0x77) {
return 1;
}
}
}
void HMI_ConfigCamera(void) {
u8 cmd[1] = {0};
u8 acknowledge = 0;
while(1) {
while(!HMI_GetCmd(cmd, 1));
CAMERA_ClearRX();
CAMERA_Send_Cmd(cmd[0]);
// delay_ms(1000);
if(cmd[0]==0x15 || cmd[0]==0x25 || cmd[0]==0x26) {
//阶段性配置检验,等待摄像头回复信息
while(!CAMERA_Receive_Data(&acknowledge));
if(acknowledge==0x55) {
//0x55来自openMV代码,代表取样提取阈值成功
HMI_sendCmdEnd();
HMI_SendCmd("page camera_roi");
} else if (acknowledge==0x66) {
//0x66来自openMV代码,代表roi区域设置完成且阈值可用
HMI_sendCmdEnd();
HMI_SendCmd("page calibration");
break;
} else if (acknowledge==0x77) {
//0x77来自openMV代码,代表roi区域设置完成但是阈值不可用,需重新采样设置阈值
HMI_sendCmdEnd();
HMI_SendCmd("page camera_sample");
}
}
}
}