stm32串口读取目标检测结果
适用产品
拥有串口的摄像头:
SingTown AI Vision Module SC(yes)
SingTown AI Vision Module EC(no)
目的
使用stm32,通过串口获取 SingTown AI Vision Module 的目标检测识别结果。
前提条件
模型已上传到摄像头
连接电路
SingTown AI Vision Module RX 不连接
SingTown AI Vision Module TX 连接 nucleo PA10 (uart1 rx)
SingTown AI Vision Module GND 连接 nucleo GND
SingTown AI Vision Module VIN 连接 nucleo 5V (可选)
运行stm32的代码
代码下载:
GitHub: https://github.com/SingTown/singtown-ai-cam-stm32-example/blob/main/read_singtownaicam_objs_simple.c
直接下载:
download
.
代码介绍:
此代码框架由cubemx生成。
struct DetectObj {
int score; // max 255
int idx;
int x1; // box left coordinate, max 640
int y1; // box top coordinate, max 480
int x2; // box right coordinate, max 640
int y2; // box bottom coordinate, max 480
};
#define OBJECT_MAX 8 // Max Found 8 Objects
#define OBJECT_SIZE 10 // Every Object is 10 bytes
struct DetectObj objs[OBJECT_MAX];
全局变量 objs ,用于存放读取的结果。
int check_crc(unsigned char *payload) {
unsigned char num = payload[0];
unsigned char crc = 0;
int i = 0, j = 0;
for (i = 0; i < num * OBJECT_SIZE + 2; i++) {
crc ^= payload[i];
for (j = 0; j < 8; j++) {
if (crc & 1)
crc ^= 0x91;
crc >>= 1;
}
}
return crc;
}
check_crc 为校验函数,用于校验数据帧是否正确。
int read_singtownaicam_objs() {
int i;
unsigned char num;
unsigned char payload[OBJECT_MAX * OBJECT_SIZE + 2];
unsigned char *obj_ptr;
int byte;
while (1) {
if (readByte() != 0xeb)
continue;
if (readByte() != 0x90)
continue;
num = readByte();
if (num < 0 || num > OBJECT_MAX)
continue;
payload[0] = num;
for (i = 1; i < num * OBJECT_SIZE + 2; i++) {
byte = readByte();
if (byte == -1)
break;
payload[i] = byte;
}
if (check_crc(payload) != 0)
continue;
for (i = 0; i < num; i++) {
obj_ptr = payload + i * OBJECT_SIZE + 1;
objs[i].score = obj_ptr[0];
objs[i].idx = obj_ptr[1];
objs[i].x1 = obj_ptr[2] | (obj_ptr[3] << 8);
objs[i].y1 = obj_ptr[4] | (obj_ptr[5] << 8);
objs[i].x2 = obj_ptr[6] | (obj_ptr[7] << 8);
objs[i].y2 = obj_ptr[8] | (obj_ptr[9] << 8);
}
return num;
}
}
read_singtownaicam_objs 是读取数据函数,结果存放在 objs 全局变量中。