淘晶驰串口屏

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");
			}
		}
		
	}
}

要在晶驰串口上显示由 OpenMV 采集的图像,需要完成以下步骤: ### 图像数据格式转换 OpenMV 模块通常输出的是 RGB565 或 JPEG 格式的图像数据。为了在晶驰串口上正确显示图像,需将这些数据转换为适合串口通信的数据格式。例如,如果使用 RGB565 格式,则每个像素点用 16 位表示;如果是 JPEG 格式,则可以直接通过串口发送压缩后的数据[^1]。 ### 串口通信协议配置 确保 OpenMV 和晶驰串口之间的串口通信参数一致,包括波特率、数据位、停止位和校验位。常见的波特率设置为 9600、115200 等。可以使用 UART 接口进行数据传输,其中 TX 引脚连接到对方的 RX 引脚,同时 GND 连接以保证电平参考一致。 ### 发送图像数据串口 对于晶驰串口,可以通过特定命令将图像数据写入幕缓存区。例如,使用 `CAMERA_Send_Cmd` 函数发送控制命令,随后调用 `CAMERA_Receive_Data` 函数接收图像数据并将其发送至串口。需要注意的是,在发送图像数据之前可能还需要发送一些初始化命令来配置幕显示模式[^1]。 ### 示例代码 以下是一个简单的示例代码片段,展示了如何通过串口发送图像数据: ```c #include "camera.h" void displayImageOnSerialScreen() { u8 imageData[IMAGE_SIZE]; // 假设 IMAGE_SIZE 是预定义的图像大小 CAMERA_Init(); // 初始化摄像头 if (CAMERA_Check_Ready()) { // 检查摄像头是否准备好 CAMERA_Send_Cmd(START_IMAGE_TRANSFER); // 发送开始传输图像的命令 while (!CAMERA_Get_GoalErro(imageData)) { // 获取图像数据 CAMERA_Receive_Data(imageData); // 接收图像数据 sendToSerialScreen(imageData, sizeof(imageData)); // 将图像数据发送至串口 } CAMERA_ClearRX(); // 清除接收缓冲区 CAMERA_Release(); // 释放资源 } } // 假设此函数负责实际的数据发送过程 void sendToSerialScreen(u8* data, int length) { // 实现具体的串口发送逻辑 } ``` ### 注意事项 - 在实际应用中,应根据具体硬件型号调整串口通信参数及图像处理流程。 - 需要查阅晶驰串口的手册了解支持的图像格式以及相应的控制指令。 - 考虑到带宽限制,建议选择合适的图像分辨率与压缩方式以提高传输效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

匿名匿名匿名11

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

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

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

打赏作者

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

抵扣说明:

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

余额充值