k210和STM32、arduino通信1.通信协议说明1.协议定义2.k210和stm32通信2.1 实验前提2.2 实验接线2.3 根据协议的封装,stm32的获取主要数据的代码如下:2.4实验现象3.k210和arduino通信3.1 实验前提3.2 实验接线2.3 根据协议的封装,arduino的解析主要数据的代码如下:3.4实验现象4.附录4.1 k210脱机运行操作方法4.2 串口助手数据解析
分析:
协议定义 | 解析 |
---|---|
$ | 开始符 |
长度 | 从开始符号之后到结束符号之前的所有字符的数量 |
例程编号 | 两个字节,对应例程ID号,小于10的前面补零 |
例程组 | 两个字节,默认为BB |
数据量 | 下面数据的个数 |
数据 | 数据,数据后以逗号(,)隔开,有多少个数据量就有多少个逗号 |
校验位 | 从开始符号之后到结束符号之前的所有字符的字节相加再向256取余 |
# | 结束符 |
本教程使用的是stm32C8T6,k210要运行K210-AI程序改写(stm32_pico_arduino)专用里面的程序才能开始实验 stm32 *1 k210视角模块 1(要有sd卡(里面有带AI的模型)、摄像头) usb转ttl模块1
stm32 | usb转ttl模块 |
---|---|
PA2 | RXD |
GND | GND |
STM32 | k210视角模块 |
---|---|
PA3 | TXD |
GND | GND |
VCC | 5V |
接线如图所示:
这样的接线,k210的RXD和usb转TTL的TXD是不用接的,实验没有用到。
xvoid deal_recvmsg(void)
{
u8 index,data_i=0;//数据索引
u8 eg_num = buf_msg[1];//例程编号
// u8 ed_group = buf_msg[2];//例程组
u8 number = buf_msg[3];//数据量(包含逗号)
u8 i_duo = 0;
//buf_len = buf_msg[0];//长度
if(r_index!=buf_len)//长度不符合
{
buf_len = 0;
return ;
}
for(index = 0 ;index<number;index++) //以逗号隔开
{
if(buf_msg[4+index] == 0x2c && i_duo ==0)//逗号,但不会有两个连续的逗号
{
i_duo = 1;
continue;
}
data[data_i++]=buf_msg[4+index];//第5位是有效数据开始
i_duo =0;
}
buf_crc = 0;//校验位清除
r_index = 0;
//USART2_Send_ArrayU8((uint8_t*)data,strlen(data));
memset(buf_msg,0,sizeof(buf_msg));//清除旧数据
deal_data(eg_num);
}
根据代码可知:
本教程使用的是arduino,k210要运行K210-AI程序改写(stm32_pico_arduino)专用里面的程序才能开始实验 arduino *1 k210视角模块 1(要有sd卡(里面有带AI的模型)、摄像头) usb转ttl模块1
arduino | usb转ttl模块 |
---|---|
TXD | RXD |
GND | GND |
arduino | k210视角模块 |
---|---|
RXD | TXD |
GND | GND |
VCC | 5V |
接线如图所示:
xxxxxxxxxx
void deal_data(u8 egnum)//传入值是例程编号
{
//......
switch(egnum)
{
//例程1、5、6
case 1:
case 5:
case 6:
x = data[1]<<8 | data[0];
y = data[3]<<8 | data[2];
w = data[5]<<8 | data[4];
h = data[7]<<8 | data[6];
sprintf(buff_com,"x=%d,y=%d,w=%d,h=%d\r\n",x,y,w,h);
K210Serial.print(buff_com);
break;
//例程2,3
case 2:
case 3:
x = data[1]<<8 | data[0];
y = data[3]<<8 | data[2];
w = data[5]<<8 | data[4];
h = data[7]<<8 | data[6];
sprintf(buff_com,"x=%d,y=%d,w=%d,h=%d\r\n",x,y,w,h);
K210Serial.print(buff_com);
while(*(data+8+icopy)!='\0')
{
msg[icopy] = *(data+8+icopy);
icopy ++;
}
sprintf(buff_com,"str = %s\r\n",msg);
K210Serial.print(buff_com);
break;
//例程4
case 4:
x = data[1]<<8 | data[0];
y = data[3]<<8 | data[2];
w = data[5]<<8 | data[4];
h = data[7]<<8 | data[6];
id =data[8]<<8 | data[9];
sprintf(buff_com,"x=%d,y=%d,w=%d,h=%d\r\n",x,y,w,h);
K210Serial.print(buff_com);
while(*(data+10+icopy)!='\0')
{
msg[icopy] = *(data+10+icopy);
icopy ++;
}
sprintf(buff_com,"id = %c%c,str = %s\r\n",(id>>8),id,msg);
K210Serial.print(buff_com);
break;
case 7:
case 8:
x = data[1]<<8 | data[0];
y = data[3]<<8 | data[2];
w = data[5]<<8 | data[4];
h = data[7]<<8 | data[6];
id =data[8];
sprintf(buff_com,"x=%d,y=%d,w=%d,h=%d\r\n",x,y,w,h);
K210Serial.print(buff_com);
memset(buff_com,0,sizeof(buff_com));//清除buff_com数据
if(id == 'Y' || id == 'y')
{
sprintf(buff_com,"Yes\r\n");
K210Serial.print(buff_com);
}
else
{
sprintf(buff_com,"NO\r\n");
K210Serial.print(buff_com);
}
break;
case 9:
x = data[1]<<8 | data[0];
y = data[3]<<8 | data[2];
w = data[5]<<8 | data[4];
h = data[7]<<8 | data[6];
sprintf(buff_com,"x=%d,y=%d,w=%d,h=%d\r\n",x,y,w,h);
K210Serial.print(buff_com);
while(*(data+8+icopy)!='\0')
{
msg[icopy] = *(data+8+icopy);
icopy ++;
}
sprintf(buff_com,"id = %s\r\n",msg);
K210Serial.print(buff_com);
break;
case 10:
case 11:
id = data[0];
sprintf(buff_com,"id = %c\r\n",id);
K210Serial.print(buff_com);
}
//......
}
由代码可以看到
会把识别到的颜色框的大小xywh的值在串口助手打印出来,xy是坐标,wh是宽度和长度
x:横坐标 y:纵坐标 w:宽度 h:长度 id:识别到的物体标签 str:识别到的内容信息