- void StartUartTask(void const * argument)
- {
- /* USER CODE BEGIN 5 */
- /* Infinite loop */
- HAL_UART_Receive_IT(UartHandle, RxTemp, 2);
- for(;;)
- {
- //osDelay(1);
- if (osSemaphoreWait(osSemaphore , osWaitForever) == osOK)
- {
- //HAL_UART_Transmit(UartHandle,RxTemp,1,0XFFFFF);
- if(RxTemp[0] == 'a' && RxTemp[1] == 'a')
- {
- //启用拍照,释放拍照的信号量
- ov2640_realseTakePhotoSem();
- }
- memset(RxTemp,0,2);
- HAL_UART_Receive_IT(UartHandle,RxTemp, 2);
- }
- }
- /* USER CODE END 5 */
- }
拍照线程:
- void StartOV2640Task(void const * argument)//拍照的线程
- {
- for(;;)
- {
- if (osSemaphoreWait(sem_TakePhoto , osWaitForever) == osOK)//等待串口释放拍照信号量
- {
- __HAL_DCMI_ENABLE_IT(DCMI_hdcmi, DCMI_IT_FRAME);//使用帧中断
- memset((void *)JpegBuffer,0,sizeof(JpegBuffer));//把接收BUF清空
- HAL_DCMI_Start_DMA(DCMI_hdcmi, DCMI_MODE_SNAPSHOT,(uint32_t)JpegBuffer, pictureBufferLength);//启动拍照
- if(osSemaphoreWait(sem_GetPhoto , osWaitForever) == osOK)//等待DCMI释放一帧图像信号量
- {
- HAL_DCMI_Suspend(DCMI_hdcmi);//拍照完成,挂起DCMI
- HAL_DCMI_Stop(DCMI_hdcmi);//拍照完成,停止DMA传输
- int pictureLength =pictureBufferLength;
- while(pictureLength > 0)//循环计算出接收的JPEG的大小
- {
- if(JpegBuffer[pictureLength-1] != 0x00000000)
- {
- break;
- }
- pictureLength--;
- }
- pictureLength*=4;//buf是uint32_t,下面发送是uint8_t,所以长度要*4
- Uart_Send((uint8_t*)JpegBuffer, pictureLength);
- }
- }
- }
- }
上位机收到的拍照显示(送给大家个大橙子):
图4 上位机显示