当前位置:   article > 正文

HI-LINK KT210 Al人脸识别串口通信协议_人脸识别 串口通信

人脸识别 串口通信

本次使用了海凌科生产的测试板,该测试板需要自行引线才能与stm32进行串口通信,需注意模块的引脚。串口TTL进行交叉通信,GND做共地处理。

 

  1. u16 xbx_crc_calculate(u8 *addr ,u8 datalen)//CRC校验方式
  2. {
  3. u8 i,j;
  4. u16 crc;
  5. crc = 0xffff;
  6. for(i = 0; i < datalen; i++)
  7. {
  8. crc ^= *addr++;
  9. for(j=0;j<8;j++)
  10. {
  11. if(crc & 0x01)
  12. crc = (crc >> 1) ^ 0x8408;
  13. else
  14. crc >>= 0x01;
  15. }
  16. }
  17. return ~crc;
  18. }

 

 

 

 以下是主要的通信协议代码

  1. u8 recv_date(u8 len,u16 wait_time) //中断接收
  2. {
  3. u16 time;
  4. recv_cnt=0;
  5. while(recv_cnt<=len){
  6. delay_ms(1);
  7. if(time++>wait_time)
  8. return 1;
  9. }
  10. return 0;
  11. }
  12. void Send_Byte(uint8_t byte) //串口发送一个字节
  13. {
  14. while( USART_GetFlagStatus(USART3, USART_FLAG_TC) != SET);//等待发送完成 检测 USART_FLAG_TC 是否置1
  15. USART_SendData(USART3, byte); //通过库函数发送数据
  16. USART_ClearITPendingBit(USART3, USART_IT_TC);//清除串口3发送完成中断线路挂起位
  17. }
  18. void Send_String(uint8_t *string, u16 length)
  19. {
  20. static u16 i=0;
  21. for(i = 0; i < length; i++)
  22. Send_Byte(*string++);//发送一个字节
  23. }
  24. /* 数据包格式
  25. 起始标志 0x5a2c 2字节
  26. 保留 0x0000 2字节
  27. 数据包长度 N+10 2字节
  28. 命令类型 Cmd 2字节
  29. 数据 < 256字节 n字节
  30. 校验(CRC16) 除校验位的其他全部字节 2字节
  31. */
  32. void add_head(u16 head1) //起始标志
  33. {
  34. send_buf[0]=head1>>8;
  35. send_buf[1]=(u8)head1;
  36. send_buf[2]=0x00;
  37. send_buf[3]=0x00;
  38. }
  39. void add_date_len(u16 len) //数据
  40. {
  41. send_buf[4]=len>>8;
  42. send_buf[5]=(u8)len;
  43. }
  44. void add_cmd(u16 cmd) //命令类型
  45. {
  46. send_buf[6]=cmd>>8;
  47. send_buf[7]=(u8)cmd;
  48. }
  49. u16 add_face(u16 wait_time) //添加人脸特征
  50. {
  51. u16 crc,uid;
  52. add_head(head); //0x5a2c
  53. add_cmd(add_face_cmd); //0x030c
  54. add_date_len(18);
  55. send_buf[8]= 0x00;
  56. send_buf[9]= 0x00;
  57. send_buf[10]= 0x00;
  58. send_buf[11]= 0x00;
  59. send_buf[12]= wait_time>>8; //时间高8位
  60. send_buf[13]= (u8)wait_time; //时间低8
  61. send_buf[14]= 0x00;
  62. send_buf[15]= 0x00;
  63. crc=xbx_crc_calculate(send_buf,16);
  64. send_buf[16]=crc>>8;
  65. send_buf[17]=(u8)crc;
  66. Send_String(send_buf,18);
  67. if(recv_date(18,300)==0)
  68. {
  69. if(recv_buf[15]==0) //启动人脸录入成功
  70. {
  71. printf("\r\nadd_face recv ok2\r\n");
  72. if(recv_date(21,wait_time*1000)==0)
  73. {
  74. printf("\r\nadd_face recv ok3\r\n");
  75. if(recv_buf[18]==0) //录入成功
  76. {
  77. uid = (recv_buf[16]<<8)+recv_buf[17];
  78. printf("\r\nadd_face recv ok4\r\n");
  79. }
  80. }
  81. else
  82. {
  83. printf("\r\nadd_face recv error3\r\n");
  84. return 0xffff;
  85. }
  86. }
  87. else
  88. {
  89. printf("\r\nadd_face recv error2\r\n");
  90. return 0xffff;
  91. }
  92. }
  93. else{
  94. printf("\r\nadd_face recv error1\r\n");
  95. return 0xffff;
  96. }
  97. recv_cnt=0;
  98. return uid;
  99. }
  100. u16 add_face_ret() //添加人脸特征返回
  101. {
  102. u16 uid;
  103. uid=0; //UID应该非0
  104. if(recv_cnt>=20)
  105. {
  106. delay_ms(1);
  107. recv_cnt=0;
  108. if( (recv_buf[18]==0)&&(recv_buf[6]==(add_face_ret_cmd>>8))&&(recv_buf[7]==(u8)add_face_ret_cmd))
  109. uid = (recv_buf[16]<<8)+recv_buf[17];
  110. else
  111. return 0;
  112. }
  113. return uid;
  114. }
  115. /*
  116. D:1显示 0不显示
  117. T:显示时间
  118. x:0-240 横坐标
  119. y:0-320 纵坐标
  120. colour: RGB565格式颜色
  121. str[]:待显示字符串 utf-8编码
  122. */
  123. u16 set_lcd_showstring(u8 D,u16 T,u16 x,u16 y,u16 colour,u8 str[])
  124. {
  125. u16 crc;
  126. u8 i=0;
  127. add_head(head);
  128. add_cmd(lcd_showsting_cmd);
  129. send_buf[8]= D;
  130. send_buf[9]= T>>8;
  131. send_buf[10]= (u8)T;
  132. send_buf[11]= x>>8;
  133. send_buf[12]= (u8)x;
  134. send_buf[13]= y>>8;
  135. send_buf[14]= (u8)y;
  136. send_buf[15]= colour>>8;
  137. send_buf[16]= (u8)colour;
  138. while(*str!=0)
  139. {
  140. send_buf[17+i]=*str++;
  141. i++;
  142. }
  143. add_date_len(i+19);
  144. crc=xbx_crc_calculate(send_buf,i+17);
  145. send_buf[i+17]=crc>>8;
  146. send_buf[i+18]=(u8)crc;
  147. Send_String(send_buf,i+19);
  148. if(recv_date(18,300)==0)
  149. {
  150. if(recv_buf[15]!=0) //
  151. {
  152. return 0xffff;
  153. }
  154. }
  155. else
  156. {
  157. return 0xffff;
  158. }
  159. recv_cnt=0;
  160. return 0;

人脸识别

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/150557
推荐阅读
相关标签
  

闽ICP备14008679号