本帖最后由 一路向北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];
- }
- }
实验效果,通过上位机上传图像到单片机识**返回识别结果
|