淘晶驰串口屏

2019 电子设计大赛 激光炮题目 写的程序

依赖:

usart_all.h usart_all.cSTM32超级通用串口程序(秘籍)
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");
			}
		}
		
	}
}

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

匿名匿名匿名11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值