file-type

QT实现串口数据接收与文件存储操作

下载需积分: 2 | 885KB | 更新于2024-12-29 | 70 浏览量 | 18 下载量 举报 3 收藏
download 立即下载
知识点一:QT概述 QT是一个跨平台的C++应用程序框架,广泛应用于开发图形用户界面(GUI)程序,同时也包括用于开发非GUI程序的组件,如数据库、网络、XML处理等。它提供了一系列的类库,用于处理常见的GUI任务,如窗口、按钮、菜单等。QT支持多种编程语言,包括C++、Python、Java等。 知识点二:QT串口通信 QT串口通信是指使用QT框架进行串行端口的数据收发。在QT中,通过QSerialPort类可以实现对串口的打开、配置、读写以及关闭等操作。QT串口通信主要应用于嵌入式设备与PC机之间的数据传输,如与Arduino、树莓派等设备的通信。 知识点三:上位机概念 上位机通常指的是与下位机(如嵌入式设备、单片机等)相对应的计算机系统,上位机一般具备较强的计算能力和丰富的接口资源,可以用来控制下位机并处理从下位机传来的数据。在QT上位机应用中,通过QT提供的串口通信类库可以编写上位机程序,实现对下位机的控制和数据采集。 知识点四:QT文件读写操作 QT提供了丰富的文件操作API,包括QFile、QTextStream、QDataStream等类,可以方便地对文件进行读写操作。QFile类主要负责文件的打开、关闭以及判断文件是否存在等操作;QTextStream类用于读写文本数据,支持不同编码格式;QDataStream类则用于读写二进制数据,并且可以跨平台使用。 知识点五:数据存储格式选择 描述中提到将数据保存在基于运行时间的txt文件中。选择txt文件作为存储格式的好处在于其简单性,几乎所有的操作系统和编程语言都提供了对txt文件的操作支持。而基于运行时间来命名文件,可以保证每个数据文件的唯一性,避免数据覆盖。 知识点六:实现步骤 1. 使用QSerialPort类来配置和打开串口,包括选择串口号、设置波特率等参数。 2. 当串口数据到来时,通过读取QSerialPort的缓冲区来获取数据。 3. 将获取的数据转换为适合的格式(如字符串),准备写入文件。 4. 创建QFile对象,并利用QTextStream或QDataStream将其与txt文件关联。 5. 利用QDateTime获取当前系统时间,结合文件命名规则生成文件名,以创建新文件或覆盖旧文件。 6. 使用QTextStream或QDataStream的write方法将数据写入txt文件。 7. 关闭文件和串口,完成数据的存储操作。 知识点七:QT应用开发环境搭建 在进行QT应用开发前,需要安装QT开发环境。QT开发环境包括QT Creator IDE、QT库以及编译器等。开发者可以通过QT官方网站下载安装包,并按照指示进行安装。安装完成后,开发者将能够使用QT Creator进行项目创建、编辑、构建和调试。 知识点八:调试与优化 在QT串口通信程序的开发过程中,调试是一个必不可少的环节。开发者可以使用QT Creator内置的调试工具来单步执行代码、检查变量状态、监控信号槽通信等。此外,针对文件读写操作,开发者还需要考虑到异常处理和错误处理,确保程序能够稳定运行,且在遇到错误时能够给出清晰的提示。 知识点九:跨平台开发 QT框架的另一个显著特点是其跨平台特性,意味着开发者可以编写一套代码,通过编译器编译后即可在不同的操作系统上运行。这包括Windows、macOS、Linux以及多种嵌入式操作系统。跨平台开发对于提高开发效率、扩大应用范围具有重要意义。 知识点十:持续学习与跟进 QT技术是不断更新的,因此开发者需要持续关注QT的最新动态和技术更新。这包括新的API的引入、性能的改进以及对新硬件和新标准的支持。持续学习和实践是提高个人技术能力、保持竞争力的关键。

相关推荐

filetype

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file usart.c * @brief This file provides code for the configuration * of the USART instances. ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ #include "stdio.h" /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "usart.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; DMA_HandleTypeDef hdma_usart1_rx; DMA_HandleTypeDef hdma_usart2_rx; /* USART1 init function */ void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ } /* USART2 init function */ void MX_USART2_UART_Init(void) { /* USER CODE BEGIN USART2_Init 0 */ /* USER CODE END USART2_Init 0 */ /* USER CODE BEGIN USART2_Init 1 */ /* USER CODE END USART2_Init 1 */ huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) { Error_Handler(); } if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART2_Init 2 */ /* USER CODE END USART2_Init 2 */ } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1; PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART1 DMA Init */ /* USART1_RX Init */ hdma_usart1_rx.Instance = DMA1_Stream2; hdma_usart1_rx.Init.Request = DMA_REQUEST_USART1_RX; hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart1_rx.Init.Mode = DMA_CIRCULAR; hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx); /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_MspInit 1 */ /* USER CODE END USART1_MspInit 1 */ } else if(uartHandle->Instance==USART2) { /* USER CODE BEGIN USART2_MspInit 0 */ /* USER CODE END USART2_MspInit 0 */ /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART2; PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_D2PCLK1; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /* USART2 clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART2 DMA Init */ /* USART2_RX Init */ hdma_usart2_rx.Instance = DMA1_Stream1; hdma_usart2_rx.Init.Request = DMA_REQUEST_USART2_RX; hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart2_rx.Init.Mode = DMA_CIRCULAR; hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW; hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx); /* USER CODE BEGIN USART2_MspInit 1 */ /* USER CODE END USART2_MspInit 1 */ } } void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) { if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspDeInit 0 */ /* USER CODE END USART1_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART1_CLK_DISABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); /* USART1 DMA DeInit */ HAL_DMA_DeInit(uartHandle->hdmarx); /* USART1 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART1_IRQn); /* USER CODE BEGIN USART1_MspDeInit 1 */ /* USER CODE END USART1_MspDeInit 1 */ } else if(uartHandle->Instance==USART2) { /* USER CODE BEGIN USART2_MspDeInit 0 */ /* USER CODE END USART2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART2_CLK_DISABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); /* USART2 DMA DeInit */ HAL_DMA_DeInit(uartHandle->hdmarx); /* USER CODE BEGIN USART2_MspDeInit 1 */ /* USER CODE END USART2_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ 你讲解一下每一行代码

filetype

*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'D:\Keil 524\ARM\ARMCC\Bin' Rebuild target 'Target 1' assembling startup_stm32f411xe.s... compiling stm32f4xx_dcmi.c... compiling stm32f4xx_it.c... compiling stm32f4xx_dac.c... compiling stm32f4xx_cryp_tdes.c... compiling misc.c... compiling stm32f4xx_cryp_des.c... compiling stm32f4xx_can.c... compiling stm32f4xx_dbgmcu.c... compiling stm32f4xx_adc.c... compiling stm32f4xx_cryp.c... compiling stm32f4xx_cec.c... compiling stm32f4xx_crc.c... compiling system_stm32f4xx.c... compiling stm32f4xx_cryp_aes.c... compiling stm32f4xx_dfsdm.c... compiling stm32f4xx_dma.c... compiling stm32f4xx_dma2d.c... compiling stm32f4xx_flash.c... compiling stm32f4xx_dsi.c... compiling stm32f4xx_exti.c... compiling stm32f4xx_flash_ramfunc.c... compiling stm32f4xx_ltdc.c... compiling stm32f4xx_iwdg.c... compiling stm32f4xx_i2c.c... compiling stm32f4xx_lptim.c... compiling stm32f4xx_fmpi2c.c... compiling stm32f4xx_gpio.c... compiling stm32f4xx_hash.c... compiling stm32f4xx_hash_md5.c... compiling stm32f4xx_hash_sha1.c... compiling main.c... ..\USER\main.c(2): error: #5: cannot open source input file "tjc_usart_hmi.h": No such file or directory #include "tjc_usart_hmi.h" ..\USER\main.c: 0 warnings, 1 error compiling tjc_usart_hmi.c... tjc_usart_hmi.h(27): warning: #1-D: last line of file ends without a newline #endif tjc_usart_hmi.c(7): error: #5: cannot open source input file "stm32f10x_usart.h": No such file or directory #include <stm32f10x_usart.h> tjc_usart_hmi.c: 1 warning, 1 error compiling stm32f4xx_qspi.c... compiling stm32f4xx_pwr.c... compiling stm32f4xx_rtc.c... compiling stm32f4xx_rcc.c... compiling stm32f4xx_sai.c... compiling stm32f4xx_rng.c... compiling stm32f4xx_syscfg.c... compiling stm32f4xx_sdio.c... compiling stm32f4xx_wwdg.c... compiling stm32f4xx_spdifrx.c... compiling stm32f4xx_spi.c... compiling stm32f4xx_usart.c... compiling stm32f4xx_tim.c... "..\OUTPUT\STM32F411CEU6.axf" - 2 Error(s), 1 Warning(s). Target not created. Build Time Elapsed: 00:03:35

《CHANGE》
  • 粉丝: 13
上传资源 快速赚钱