本帖最后由 一路向北lm 于 2025-4-3 16:15 编辑
利用上位机将手写数据通过串口发送给单片机。2.单片机进行获取数据利用神经网络进行判断3.将输出结果发送给上位机。上位机链接https://github.com/colin2135/HandWriteApp,下载源码后,找到这个文件路径。
定义网络句柄、输入、输出和激活缓冲区数据buf 和管理输入和输出数据的指针 ai_handle network;
float aiInData[AI_NETWORK_IN_1_SIZE];
float aiOutData[AI_NETWORK_OUT_1_SIZE];
ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE];
ai_buffer * ai_input;
ai_buffer * ai_output;
通过串口获取数据 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(goRunning ==0)
{
if (uart_rx_length < UART_BUFF_LEN)
{
uart_rx_buffer[uart_rx_length] = uart_rx_byte;
uart_rx_length++;
if (uart_rx_byte == '\n')
{
goRunning = 1;
}
}
else
{
//rt_kprintf("rx len over");
uart_rx_length = 0;
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart_rx_byte, 1);
}
处理数据,通过上位机发送的数据是8位数据,由于模型参数是32位浮点数因此输入数据要转换成32位浮点数 void PictureCharArrayToFloat(uint8_t *srcBuf,float *dstBuf,int len)
{
for(int i=0;i<len;i++)
{
dstBuf[i] = srcBuf[i];//==1?0:1;
}
}
神经网络推理 static void AI_Run(float *pIn, float *pOut)
{
char logStr[100];
int count = 0;
float max = 0;
ai_i32 batch;
ai_error err;
/* Update IO handlers with the data payload */
ai_input[0].data = AI_HANDLE_PTR(pIn);
ai_output[0].data = AI_HANDLE_PTR(pOut);
batch = ai_network_run(network, ai_input, ai_output);
if (batch != 1) {
err = ai_network_get_error(network);
printf("AI ai_network_run error - type=%d code=%d\r\n", err.type, err.code);
Error_Handler();
}
for (uint32_t i = 0; i < AI_NETWORK_OUT_1_SIZE; i++) {
sprintf(logStr,"%d %8.6f\r\n",i,aiOutData[i]);
Uart_send(logStr);
if(max<aiOutData[i])
{
count = i;
max= aiOutData[i];
}
}
sprintf(logStr,"current number is %d\r\n",count);
Uart_send(logStr);
}
将输出结果和最大值通过串口进行发送 for (uint32_t i = 0; i < AI_NETWORK_OUT_1_SIZE; i++) {
sprintf(logStr,"%d %8.6f\r\n",i,aiOutData[i]);
Uart_send(logStr);
if(max<aiOutData[i])
{
count = i;
max= aiOutData[i];
}
}
实验效果,通过上位机上传图像到单片机识**返回识别结果
|