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);}根据代码可知:

xy是坐标,wh是宽度和长度,str就是二维码的识别出来的字符数据本教程使用的是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 |
接线如图所示:

xxxxxxxxxxvoid 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:识别到的内容信息