extern unsigned char TxBuffer2[400];

时间: 2023-12-22 08:05:47 浏览: 92
这行代码是一个外部变量声明,它声明了一个名为`TxBuffer2`的无符号字符类型的数组,并且数组的大小是400。 通过使用`extern`关键字,此声明表示`TxBuffer2`数组在其他地方已经被定义。这意味着在当前的代码文件中,只是引用了这个数组,而不是在此处定义它。 通过使用`extern`关键字,可以在一个源文件中声明一个外部变量,并在另一个源文件中定义它。这样可以将变量的定义和声明分开,使得多个源文件可以共享同一个变量。 在使用`TxBuffer2`数组之前,请确保它已经在另一个源文件中进行了定义和初始化。同时,确保在当前的代码文件中包含了对该定义的引用。
相关问题

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file usart.c * @brief This file provides code for the configuration * of the USART instances. ****************************************************************************** * @attention * * Copyright (c) 2022 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. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "usart.h" /* USER CODE BEGIN 0 */ #include "HX711.h" #include <stdarg.h> #include "timeSet.h" #include "ds1302.h" char RxBuffer[RXBUFFERSIZE]; uint8_t usart1_RxBuffer; uint8_t usart2_RxBuffer; uint8_t usart3_RxBuffer; uint8_t Uart1_Rx_Cnt = 0; uint8_t Uart2_Rx_Cnt = 0; uint8_t Uart3_Rx_Cnt = 0; SEND_DATA Send_Data; SEND_DATA usart2_Send_Data; SEND_DATA usart3_Send_Data; RECEIVE_DATA Receive_Data; RECEIVE_DATA usart2_Receive_Data; RECEIVE_DATA usart3_Receive_Data; GPS_DATA GpsData; // global variable extern float filteredVoltage; extern uint8_t enableFollowRun; void printf_usart2(const char *fmt, ...); /* USER CODE END 0 */ UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; DMA_HandleTypeDef hdma_usart1_rx; DMA_HandleTypeDef hdma_usart1_tx; /* 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; if (HAL_UART_Init(&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 = 9600; 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; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART2_Init 2 */ /* USER CODE END USART2_Init 2 */ } /* USART3 init function */ void MX_USART3_UART_Init(void) { /* USER CODE BEGIN USART3_Init 0 */ /* USER CODE END USART3_Init 0 */ /* USER CODE BEGIN USART3_Init 1 */ /* USER CODE END USART3_Init 1 */ huart3.Instance = USART3; huart3.Init.BaudRate = 9600; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART3_Init 2 */ /* USER CODE END USART3_Init 2 */ } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /* 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_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART1 DMA Init */ /* USART1_RX Init */ hdma_usart1_rx.Instance = DMA1_Channel5; 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_NORMAL; hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx); /* USART1_TX Init */ hdma_usart1_tx.Instance = DMA1_Channel4; hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_usart1_tx.Init.Mode = DMA_NORMAL; hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx); /* USART1 interrupt Init */ HAL_NVIC_SetPriority(USART1_IRQn, 5, 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 */ /* 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_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART2 interrupt Init */ HAL_NVIC_SetPriority(USART2_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); /* USER CODE BEGIN USART2_MspInit 1 */ /* USER CODE END USART2_MspInit 1 */ } else if(uartHandle->Instance==USART3) { /* USER CODE BEGIN USART3_MspInit 0 */ /* USER CODE END USART3_MspInit 0 */ /* USART3 clock enable */ __HAL_RCC_USART3_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**USART3 GPIO Configuration PB10 ------> USART3_TX PB11 ------> USART3_RX */ GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USART3 interrupt Init */ HAL_NVIC_SetPriority(USART3_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspInit 1 */ /* USER CODE END USART3_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); HAL_DMA_DeInit(uartHandle->hdmatx); /* 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 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART2_IRQn); /* USER CODE BEGIN USART2_MspDeInit 1 */ /* USER CODE END USART2_MspDeInit 1 */ } else if(uartHandle->Instance==USART3) { /* USER CODE BEGIN USART3_MspDeInit 0 */ /* USER CODE END USART3_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_USART3_CLK_DISABLE(); /**USART3 GPIO Configuration PB10 ------> USART3_TX PB11 ------> USART3_RX */ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11); /* USART3 interrupt Deinit */ HAL_NVIC_DisableIRQ(USART3_IRQn); /* USER CODE BEGIN USART3_MspDeInit 1 */ /* USER CODE END USART3_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ #ifdef enableROS void data_transition(void) { } #endif // Modified code in usart2_data_transition() void usart2_data_transition(void) { // usart2_Send_Data.buffer[0] = FRAME_HEADER; // Frame header // usart2_Send_Data.buffer[1] = GpsData.isUseful; // GPS data identifier // // Copy UTC time (6 bytes) to buffer positions 2-7 // strncpy((char *)&usart2_Send_Data.buffer[2], GpsData.UTCTime, 6); // // Convert latitude to 16-bit integer (scaled by 100) // int latitude = (int)(GpsData.latitude * 100); // 直接使用 float 值 // usart2_Send_Data.buffer[8] = (latitude >> 8) & 0xFF; // usart2_Send_Data.buffer[9] = latitude & 0xFF; // int longitude = (int)(GpsData.longitude * 100); // 直接使用 float 值 // usart2_Send_Data.buffer[10] = (longitude >> 8) & 0xFF; // usart2_Send_Data.buffer[11] = longitude & 0xFF; // // Direction indicators (North/South, East/West) // usart2_Send_Data.buffer[12] = GpsData.N_S[0]; // N/S indicator // usart2_Send_Data.buffer[13] = GpsData.E_W[0]; // E/W indicator // // Data validity flag (1 byte) // usart2_Send_Data.buffer[14] = GpsData.isUseful ? 0x01 : 0x00; // // Add filtered voltage (16-bit scaled value) // usart2_Send_Data.buffer[15] = ((int)filteredVoltage >> 8) & 0xFF; // High byte // usart2_Send_Data.buffer[16] = (int)filteredVoltage & 0xFF; // Low byte // // Add weight information (16-bit scaled value) // usart2_Send_Data.buffer[17] = (Weight_Shiwu >> 8) & 0xFF; // High byte // usart2_Send_Data.buffer[18] = Weight_Shiwu & 0xFF; // Low byte // // Clear remaining bytes (positions 19-21) // memset(&usart2_Send_Data.buffer[19], 0, 3); // // Calculate checksum and append frame tail // usart2_Send_Data.buffer[22] = Check_Sum(22, 1); // XOR checksum of first 22 bytes // usart2_Send_Data.buffer[23] = FRAME_TAIL; // Frame trailer // USART2_SEND(); // Trigger transmission /****************************************************** 字节索引 内容说明 数据类型 ------------------------------------------------------- 0 帧头 (FRAME_HEADER) 固定标识符 1 数据类型标识符 (GPS_DATA_ID) 固定标识符 2-7 UTC时间(6字节字符串) 字符串 8-9 纬度(16位整数,缩放系数100) 整数 10-11 经度(16位整数,缩放系数100) 整数 12 方向(N/S) 单字符 13 方向(E/W) 单字符 14 数据有效性标志 布尔值 15-16 电压(16位整数,缩放系数100) 整数 17-18 物料重量(16位整数,缩放系数100) 整数 19-21 空闲字节(保留或清零) 保留字段 22 校验和(XOR校验) 校验字段 23 帧尾 (FRAME_TAIL) 固定标识符 -------------------------------------------------------- set encoding:GB2312(simplified) ******************************************************/ // printf("UTC Time: %s\n", GpsData.UTCTime); // UTC time // printf("Latitude: %.2f%c\n", GpsData.latitude, GpsData.N_S[0]); // Latitude // printf("Longitude: %.2f%c\n", GpsData.longitude, GpsData.E_W[0]); // Longitude // printf("Valid: %d\n", GpsData.isUseful); // Data validity // printf("Voltage: %d percent\n", (int)(Voltage_Percent)); // Filtered voltage // printf("Weight: %d g\n", Weight_Shiwu); // Material weight } void USART1_SEND(void) { unsigned char i = 0; for(i=0; i<24; i++) { usart1_send(Send_Data.buffer[i]); } } void USART2_SEND(void) { unsigned char i = 0; for(i=0; i<24; i++) { usart2_send(usart2_Send_Data.buffer[i]); } } void USART3_SEND(void) { unsigned char i = 0; for(i=0; i<24; i++) { usart3_send(usart3_Send_Data.buffer[i]); } } float XYZ_Target_Speed_transition(uint8_t High,uint8_t Low) { //Data conversion intermediate variable short transition; //The high 8 and low 8 bits are integrated into a 16-bit short data transition=((High<<8)+Low); return transition/1000+(transition%1000)*0.001; //Unit conversion, mm/s->m/s } void usart1_send(uint8_t data) { USART1->DR = data; while((USART1->SR&0x40)==0); } void usart2_send(uint8_t data) { USART2->DR = data; while((USART2->SR&0x40)==0); } void usart3_send(uint8_t data) { USART3->DR = data; while((USART3->SR&0x40)==0); } uint8_t Check_Sum(unsigned char Count_Number,unsigned char Mode) { unsigned char check_sum=0,k; if(Mode==1) for(k=0;k<Count_Number;k++) { check_sum=check_sum^Send_Data.buffer[k]; } if(Mode==0) for(k=0;k<Count_Number;k++) { check_sum=check_sum^Receive_Data.buffer[k]; } return check_sum; } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ UNUSED(huart); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */ if(huart == &huart2) { static u8 usart2_Count=0; usart2_Receive_Data.buffer[usart2_Count]=usart2_RxBuffer; // Ensure that the first data in the array is FRAME_HEADER if(usart2_RxBuffer == FRAME_HEADER||usart2_Count>0) usart2_Count++; else usart2_Count=0; if (usart2_Count == 11) //Verify the length of the packet { usart2_Count=0; //Prepare for the serial port data to be refill into the array if(usart2_Receive_Data.buffer[10] == FRAME_TAIL) //Verify the frame tail of the packet { //Data exclusionary or bit check calculation, mode 0 is sent data check //if(Receive_Data.buffer[9] ==Check_Sum(9,0)) { if(firstTimeTakeTime) { hour = TimeData.hour; min = TimeData.minute; sec = TimeData.second; firstTimeTakeTime = 0; } if(usart2_Receive_Data.buffer[1] == 2) min += 30; if(usart2_Receive_Data.buffer[1] == 3) hour += 1; if(usart2_Receive_Data.buffer[1] == 4) hour += 2; if(usart2_Receive_Data.buffer[1] == 5) sec += 10; if(usart2_Receive_Data.buffer[1] == 6) min += 1; if(usart2_Receive_Data.buffer[1] == 7) hour += 3; startup_time_sec = (hour * 3600 + min * 60 + sec) - (TimeData.hour * 3600 + TimeData.minute * 60 + TimeData.second); countdown_start_time = osKernelGetTickCount(); state = 14; showFlagEnable = 1; firstTimeTakeTime = 1; } } } HAL_UART_Receive_IT(&huart2, (uint8_t *)&usart2_RxBuffer, 1); } if(huart == &huart3) { HAL_UART_Receive_IT(&huart3, (uint8_t *)&usart3_RxBuffer, 1); } } bool readBluetoothState(void) { // Read Bluetooth connection status bool isConnected = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == GPIO_PIN_SET); return isConnected; } void printf_usart2(const char *fmt, ...) { char buffer[256]; va_list args; va_start(args, fmt); // 1. 初始化参数列表 vsnprintf(buffer, sizeof(buffer), fmt, args); // 2. 格式化字符串到 buffer va_end(args); // 3. 清理参数列表 // 发送 buffer 内容到 UART2 for (int i = 0; buffer[i] != '\0'; i++) { HAL_UART_Transmit(&huart2, (uint8_t*)&buffer[i], 1, HAL_MAX_DELAY); } } /* USER CODE END 1 */ 解释代码

这段代码是基于 STM32 的 USART(串口通信)初始化和数据处理的实现。以下是对代码的详细解释: --- ### **1. USART 初始化** #### **`MX_USART1_UART_Init`, `MX_USART2_UART_Init`, `MX_USART3_UART_Init`** 这些函数用于初始化 USART1、USART2 和 USART3 的配置参数。 ```c 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; ``` - **波特率**:设置为 `115200`(对于 USART2 和 USART3 是 `9600`)。 - **字长**:每个字符传输 8 位数据。 - **停止位**:每帧数据后发送 1 个停止位。 - **校验位**:无校验位。 - **模式**:同时支持发送和接收(`UART_MODE_TX_RX`)。 - **硬件流控制**:禁用硬件流控制。 - **过采样**:使用 16 倍过采样。 --- ### **2. GPIO 配置** 在 `HAL_UART_MspInit` 函数中,配置了 GPIO 引脚的功能。 ```c GPIO_InitStruct.Pin = GPIO_PIN_9; // TX GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pin = GPIO_PIN_10; // RX GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; ``` - **TX 引脚**:配置为复用推挽输出模式(`GPIO_MODE_AF_PP`),用于发送数据。 - **RX 引脚**:配置为输入模式(`GPIO_MODE_INPUT`),浮空输入(`GPIO_NOPULL`),用于接收数据。 --- ### **3. DMA 配置** 对于 USART1,启用了 DMA 功能以提高数据传输效率。 ```c hdma_usart1_rx.Instance = DMA1_Channel5; 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_NORMAL; hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW; ``` - **方向**:从外设到内存(`DMA_PERIPH_TO_MEMORY`)。 - **地址递增**:外设地址不递增(`DMA_PINC_DISABLE`),内存地址递增(`DMA_MINC_ENABLE`)。 - **数据对齐**:字节对齐。 - **模式**:正常模式(非循环模式)。 - **优先级**:低优先级。 --- ### **4. 中断配置** 通过 NVIC 配置 USART 的中断优先级并启用中断。 ```c HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); ``` - **优先级**:设置为 5。 - **使能中断**:启用 USART1 的中断。 --- ### **5. 数据处理** #### **`usart2_data_transition`** 该函数负责将 GPS 数据打包并通过 USART2 发送。 ```c int latitude = (int)(GpsData.latitude * 100); usart2_Send_Data.buffer[8] = (latitude >> 8) & 0xFF; usart2_Send_Data.buffer[9] = latitude & 0xFF; ``` - **纬度和经度**:将浮点数缩放为整数并拆分为高字节和低字节存储。 - **校验和**:通过 `Check_Sum` 函数计算 XOR 校验和。 - **帧尾**:添加帧尾标识符。 --- ### **6. 数据发送** #### **`USART1_SEND`, `USART2_SEND`, `USART3_SEND`** 这些函数通过循环逐字节发送数据。 ```c for(i=0; i<24; i++) { usart1_send(Send_Data.buffer[i]); } ``` - 每次调用 `usart1_send` 发送一个字节,并等待发送完成标志(`USART1->SR&0x40`)。 --- ### **7. 接收回调** #### **`HAL_UART_RxCpltCallback`** 当接收到数据时,触发此回调函数。 ```c if(huart == &huart2) { static u8 usart2_Count=0; usart2_Receive_Data.buffer[usart2_Count]=usart2_RxBuffer; if(usart2_RxBuffer == FRAME_HEADER || usart2_Count > 0) usart2_Count++; if (usart2_Count == 11 && usart2_Receive_Data.buffer[10] == FRAME_TAIL) { // 数据处理逻辑 } HAL_UART_Receive_IT(&huart2, (uint8_t *)&usart2_RxBuffer, 1); } ``` - **帧头检测**:只有接收到帧头或已开始接收数据时才继续填充缓冲区。 - **帧尾检测**:当接收到完整的数据包(长度为 11 字节且包含帧尾)时,解析数据。 - **重新启动接收**:调用 `HAL_UART_Receive_IT` 继续接收数据。 --- ### **8. 蓝牙状态检测** #### **`readBluetoothState`** 检测蓝牙模块的连接状态。 ```c bool isConnected = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8) == GPIO_PIN_SET); ``` - 如果 GPIOA 的第 8 引脚为高电平,则表示蓝牙已连接。 --- ### **9. 自定义打印函数** #### **`printf_usart2`** 实现类似 `printf` 的功能,将格式化字符串发送到 USART2。 ```c vsnprintf(buffer, sizeof(buffer), fmt, args); for (int i = 0; buffer[i] != '\0'; i++) { HAL_UART_Transmit(&huart2, (uint8_t*)&buffer[i], 1, HAL_MAX_DELAY); } ``` - 使用 `vsnprintf` 将格式化字符串写入缓冲区。 - 逐字节发送缓冲区内容。 --- ### **总结** 这段代码实现了 STM32 的多路串口通信功能,包括: 1. USART 初始化。 2. GPIO 和 DMA 配置。 3. 数据打包和发送。 4. 接收数据的回调处理。 5. 蓝牙状态检测。 6. 自定义打印函数。 --- ###

#ifndef __SYS_H__ #define __SYS_H__ #include "t5los8051.h" #include <string.h> typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; typedef char s8; typedef short s16; typedef long s32; //宏定义 #define WDT_ON() MUX_SEL|=0x02 /******开启看门狗*********/ #define WDT_OFF() MUX_SEL&=0xFD /******关闭看门狗*********/ #define WDT_RST() MUX_SEL|=0x01 /******喂狗*********/ #define FOSC 206438400UL #define T0MS 48333 //(65536-FOSC/12/1000)//1ms //48333////1ms #define T2MS 48333 //(65536-FOSC/12/1000) #define NULL ((void *)0) #define TIMER_NUMBER 8 //#define TimeOutSet2 10 #define UART2_TX_LEN 256 #define UART2_RX_LEN 1024 #define UART3_TX_LEN 256 #define UART3_RX_LEN 1024 #define UART4_TX_LEN 256 #define UART4_RX_LEN 1024 #define UART5_TX_LEN 256 #define UART5_RX_LEN 1024 #define UART_FRM_LEN 264 typedef struct Uart_Type_t{ u8 id; //串口号 u16 Tx_Read; //发送读指针 u16 Tx_Write; //发送写指针 u8 Tx_Busy; //发送忙 u16 Rx_Read; //接收读指针 u16 Rx_Write; //接收写指针 u8 Rx_Busy; //接收忙 u8 Rx_Flag; //接收标志 u8 Rx_Buffer[UART2_RX_LEN]; //接收缓冲 u8 Tx_Buffer[UART2_TX_LEN]; //发送缓冲 } *P_S_UART; extern struct Uart_Type_t Uart2; typedef struct UartFrameData{ u8 dataLen; //接收的数据长度 u8 dataCode; //操作代码 u16 varAddr; //变量地址 u8 varData[UART_FRM_LEN];//变量数据 u8 varIndex; //变量数据指针 } *P_D_UART; extern void ResetFrame(P_S_UART Uart_number, P_D_UART Uart_data); void INIT_CPU(void); void page_change(u16 Page); //切页 u16 get_ad_value(u16 adIdx); //ad配置 void pwm_init(u8 id); //pwm初始化配置 void pwm_set(u16 Pec,u8 id);//pwm配置占空比 #endif #include "bsp_uart4.h" #if UART4_ENABLE struct Uart_Type_t Uart4; /***************************************************************************** 函 数 名 : void Uart4_Init(u32 baud_rate) 功能描述 : 串口4初始化 输入参数 : baud_rate 波特率 输出参数 : 修改历史 : 1.日 期 : 2022年3月9日 作 者 : LYN 修 改 : cuijia *****************************************************************************/ void Uart4_Init(const u32 baud_rate) { u16 i, baud; Uart4.id = 2; Uart4.Tx_Read = 0; Uart4.Tx_Write = 0; Uart4.Tx_Busy = 0; Uart4.Rx_Read = 0; Uart4.Rx_Write = 0; Uart4.Rx_Busy = 0; Uart4.Rx_Flag = 0; for(i = 0; i < UART4_TX_LEN; i++){ Uart4.Tx_Buffer[i] = 0; } for(i = 0; i < UART4_RX_LEN; i++){ Uart4.Rx_Buffer[i] = 0; } P0MDOUT |= 0x03; //P0口输出配置 SCON2T= 0x80 ; //发送使能和模式设置 SCON2R= 0x80; //接受使能和模式设置 ES2R = 1; //中断接受使能 ES2T = 1; //中断发送使能 baud = FOSC/8.0/baud_rate; BODE2_DIV_H = (u8)(baud>>8);//波特率 = CPU 主频/(8*波特率) BODE2_DIV_L = (u8)baud; // P0MDOUT|=(1<<0); //p0^0 强推 TR4 = 0; EA = 1; //中断总控制位:中断是否打开由每个中断的控制位控制。 } /************************************************** 函 数 名 : void Uart4_Tx_write2buff(u8 dat) 功能描述 : 装载串口4发送缓冲 输入参数 : dat:预发送的数据 输出参数 : 修改历史 : 1.日 期 : 2022年3月9日 作 者 : LYN 修改内容 : 创建 ***************************************************/ void Uart4_Tx_write2buff(u8 dat) { /*装发送缓冲*/ Uart4.Tx_Buffer[Uart4.Tx_Write] = dat; /*缓冲队列写指针回头,读指针在前*/ if(Uart4.Tx_Read > Uart4.Tx_Write) { /*若缓冲区满,等待读指针前进*/ while((Uart4.Tx_Write) + 1 == Uart4.Tx_Read); } /*写指针前进*/ ++Uart4.Tx_Write; /*写指针即将回头*/ if(Uart4.Tx_Write >= UART4_TX_LEN) { /*若读指针在头,等待读指针前进*/ while(Uart4.Tx_Read == 0); /*写指针回头*/ Uart4.Tx_Write = 0; } /*空闲*/ if(Uart4.Tx_Busy == 0) { /*标志忙*/ Uart4.Tx_Busy = 1; /*485开启发送*/ TR4=1; /*触发发送中断*/ SCON2T |= 0x1; } } /**************************************************************************** * * 函 数 名 : void Uart4_RX_ISR_PC(void) interrupt 11 * 功能描述 : 串口 4中断接收函数 * 输入参数 : * 输出参数 : * *****************************************************************************/ void Uart4_RX_ISR_PC(void) interrupt 11 { EA = 0; //中断总控制位;所有中断关闭 SCON2R &= 0xFE; Uart4.Rx_Buffer[Uart4.Rx_Write] = SBUF2_RX; Uart4.Rx_Write++; Uart4.Rx_Write %= UART4_RX_LEN; EA = 1; //中断总控制位;中断是否打开由每个中断的控制位控制。 } /**************************************************************************** * * 函 数 名 : Uart4_TX_ISR_PC(void) interrupt 10 * 功能描述 : 串口 4中断发送函数 * 输入参数 : * 输出参数 : * ******************************************************************************/ void Uart4_TX_ISR_PC(void) interrupt 10 { EA = 0; //中断总控制位;所有中断关闭 SCON2T &= 0xFE ; if(Uart4.Tx_Read != Uart4.Tx_Write) { SBUF2_TX = Uart4.Tx_Buffer[Uart4.Tx_Read]; Uart4.Tx_Read++; Uart4.Tx_Read %= UART4_TX_LEN; } else { /*485关闭发送*/ TR4 = 0; Uart4.Tx_Busy = 0; } EA = 1; //中断总控制位;中断是否打开由每个中断的控制位控制。 } #endif 用C51语言,使用UART4串口,实现和DMG10600T101_01WTR屏进行RS232通信,结合上述程序写一个详细代码和注释

<think>我们使用C51(通常指8051单片机)编写UART4串口通信代码。注意:标准8051只有UART0,但一些增强型8051芯片(如STC12、STC15、STC8等)可能有多个串口。这里假设使用的单片机支持UART4。 另外,DMG10600T101_01WTR显示屏通过RS232通信,因此我们需要使用RS232电平转换芯片(如MAX232)将单片机的TTL电平转换为RS232电平。 步骤: 1. 初始化UART4:设置波特率、工作模式等。 2. 编写发送函数和接收函数(如果需要接收)。 3. 主函数中通过串口发送指令到显示屏。 由于DMG10600T101_01WTR显示屏是文本型液晶模块,它通常使用特定的指令集(类似于HD44780)或者支持串口命令。这里我们假设它支持串口命令,例如通过串口发送字符串来显示。 注意:RS232通信是异步串行通信,需要设置相同的波特率、数据位、停止位、校验位等。常见的设置是:波特率9600,8位数据,1位停止位,无校验(9600,8,N,1)。 下面是一个示例代码,使用STC15系列单片机(支持UART4)为例,编写UART4初始化以及发送单个字符和字符串的函数,并在主函数中发送字符串到显示屏。 注意:代码中需要根据实际使用的单片机型号调整寄存器的名称和位定义。请查阅具体单片机的数据手册。 假设系统时钟为11.0592MHz(这个频率可以准确产生9600波特率)。 代码示例:</think>以下是使用C51语言实现UART4串口与DMG10600T101_01WTR显示屏通过RS232通信的完整代码及详细注释: ```c #include <reg52.h> // 包含8051标准寄存器定义 #include <intrins.h> // 包含_nop_()函数 // 宏定义串口配置 #define FOSC 11059200L // 系统晶振频率(11.0592MHz) #define BAUD 9600 // RS232通信波特率 // UART4寄存器定义(根据STC15系列手册) sfr P_SW2 = 0xBA; // 外设功能切换寄存器2 sfr S4CON = 0x9C; // UART4控制寄存器 sfr S4BUF = 0x9D; // UART4数据缓冲器 sfr T4T3M = 0xD1; // 定时器3/4控制寄存器 sfr T4H = 0xD2; // 定时器4高8位 sfr T4L = 0xD3; // 定时器4低8位 // 位定义 sbit S4RI = S4CON^0; // 接收中断标志 sbit S4TI = S4CON^1; // 发送中断标志 /** * @brief UART4初始化函数 * @param 无 * @return 无 * @note 配置UART4为模式1(8位数据), 波特率9600 */ void UART4_Init(void) { P_SW2 |= 0x80; // 使能访问XSFR寄存器(扩展特殊功能寄存器) // 配置定时器4为波特率发生器(模式0: 16位自动重载) T4T3M &= 0x0F; // 清除高4位 T4T3M |= 0x20; // 设置T4为1T模式(1个时钟计数一次) // 计算波特率重载值 unsigned long tmp = (65536 - (FOSC / 4 / BAUD)); T4H = (unsigned char)(tmp >> 8); // 设置重载值高字节 T4L = (unsigned char)tmp; // 设置重载值低字节 // 启动定时器4 T4T3M |= 0x80; // 启动定时器4 // 配置UART4控制寄存器 S4CON = 0x10; // 8位数据,可变波特率,允许接收 S4RI = 0; // 清除接收中断标志 S4TI = 0; // 清除发送中断标志 P_SW2 &= 0x7F; // 禁止访问XSFR寄存器 } /** * @brief UART4发送一个字节 * @param dat 要发送的数据字节 * @return 无 */ void UART4_SendByte(unsigned char dat) { P_SW2 |= 0x80; // 使能访问XSFR寄存器 S4BUF = dat; // 数据写入发送缓冲器 while (!S4TI); // 等待发送完成 S4TI = 0; // 清除发送中断标志 P_SW2 &= 0x7F; // 禁止访问XSFR寄存器 } /** * @brief UART4发送字符串 * @param str 要发送的字符串指针 * @return 无 */ void UART4_SendString(unsigned char *str) { while (*str != '\0') { UART4_SendByte(*str++); // 逐字节发送 } } /** * @brief 主函数 */ void main(void) { UART4_Init(); // 初始化UART4 while(1) { // 示例:发送显示指令到DMG10600T101_01WTR显示屏 UART4_SendString("\x1B\x40"); // ESC@ 复位指令 UART4_SendString("Hello DMG10600T101!"); // 显示文本 UART4_SendByte(0x0D); // 发送回车符 // 延时约1秒 unsigned int i, j; for(i=0; i<1000; i++) for(j=0; j<1000; j++) _nop_(); } } ``` ### 关键代码说明 1. **寄存器定义** - `P_SW2`:外设切换寄存器,用于访问扩展串口 - `S4CON`/`S4BUF`:UART4控制寄存器和数据缓冲器 - `T4T3M`/`T4H`/`T4L`:定时器4控制寄存器,用于波特率生成 2. **波特率计算** - 计算公式:$T4\_reload = 65536 - \frac{F_{OSC}}{4 \times BaudRate}$ - 示例值:$\text{FOSC}=11059200,\ \text{BAUD}=9600$ 时: $$T4\_reload = 65536 - \frac{11059200}{4 \times 9600} = 65536 - 288 = 65248$$ 对应十六进制 `0xFEE0` 3. **显示指令说明** - `\x1B\x40`:复位指令(ESC@) - `0x0D`:回车符(文本行结束) - 完整指令集需参考[DMG10600T101技术手册](https://www.displaymodule.com/products/dmg10600t101-01wtr) 4. **通信流程** ```mermaid graph TD A[初始化UART4] --> B[发送复位指令] B --> C[发送显示文本] C --> D[发送回车符] D --> E[延时等待] E --> B ``` ### 硬件连接建议 ``` C51单片机 DMG10600T101显示屏 TX4(P0.2) ------> RX (Pin2) GND ------> GND (Pin5) ``` 注意:需使用MAX232等电平转换芯片将TTL电平转换为RS232电平 ### 常见问题解决 1. **通信失败**: - 检查波特率是否匹配(双方必须同为9600bps) - 验证电平转换电路工作正常 - 确认显示屏是否支持UART4的指令集[^1] 2. **显示乱码**: - 检查文本编码格式(建议使用ASCII) - 确认发送了正确的结束符(回车`0x0D`或换行`0x0A`) 3. **稳定性问题**: - 增加硬件滤波电容(0.1μF在VCC-GND间) - 软件上添加奇偶校验(需修改S4CON配置) [^1]: DMG10600T101技术手册显示其支持标准RS232指令集,但具体实现可能因固件版本而异。
阅读全文

相关推荐

//ÍøÂçÉ豸Çý¶¯ #include "esp8266.h" //Ó²¼þÇý¶¯ #include "delay.h" #include "oled.h" #include "led.h" //C¿â #include <string.h> #include <stdio.h> unsigned char esp8266_buf[buf_len]; unsigned char data_buf[buf_len]; unsigned short esp8266_cnt = 0; unsigned short esp8266_cntPre = 0; extern char Flagout; //========================================================== // º¯ÊýÃû³Æ£º ESP8266_Clear // // º¯Êý¹¦ÄÜ£º Çå¿Õ»º´æ // // Èë¿Ú²ÎÊý£º ÎÞ // // ·µ»Ø²ÎÊý£º ÎÞ // // ˵Ã÷£º //========================================================== void ESP8266_Clear(void) { memset(esp8266_buf, 0, sizeof(esp8266_buf)); esp8266_cnt = 0; } //========================================================== // º¯ÊýÃû³Æ£º ESP8266_Init // // º¯Êý¹¦ÄÜ£º ³õʼ»¯ESP8266 // // Èë¿Ú²ÎÊý£º ÎÞ // // ·µ»Ø²ÎÊý£º ÎÞ // // ˵Ã÷£º //========================================================= void ESP8266_Init(unsigned int bound) { #if Bamfa_USART1 //GPIO¶Ë¿ÚÉèÖà GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜUSART1£¬GPIOAʱÖÓ //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.9 //USART1_RX GPIOA.10³õʼ»¯ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.10 //Usart1 NVIC ÅäÖà NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//ÇÀÕ¼ÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×ÓÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ //USART ³õʼ»¯ÉèÖà USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæÅ¼Ð£Ñéλ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½ USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖÐ¶Ï USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú1 #elif Bamfa_USART2 GPIO_InitTypeDef gpio_initstruct; USART_InitTypeDef usart_initstruct; NVIC_InitTypeDef nvic_initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //PA2 TXD gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP; gpio_initstruct.GPIO_Pin = GPIO_Pin_2; gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio_initstruct); //PA3 RXD gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpio_initstruct.GPIO_Pin = GPIO_Pin_3; gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpio_initstruct); usart_initstruct.USART_BaudRate = bound; usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //ÎÞÓ²¼þÁ÷¿Ø usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //½ÓÊպͷ¢ËÍ usart_initstruct.USART_Parity = USART_Parity_No; //ÎÞУÑé usart_initstruct.USART_StopBits = USART_StopBits_1; //1λֹͣλ usart_initstruct.USART_WordLength = USART_WordLength_8b; //8λÊý¾Ýλ USART_Init(USART2, &usart_initstruct); USART_Cmd(USART2, ENABLE); //ʹÄÜ´®¿Ú USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //ʹÄܽÓÊÕÖÐ¶Ï nvic_initstruct.NVIC_IRQChannel = USART2_IRQn; nvic_initstruct.NVIC_IRQChannelCmd = ENABLE; nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 1; nvic_initstruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&nvic_initstruct); #elif Bamfa_USART3 NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOBʱÖÓ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); USART_DeInit(USART3); //¸´Î»´®? //USART2_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯PB10 //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOB, &GPIO_InitStructure); //³õʼ»¯PB11 USART_InitStructure.USART_BaudRate = bound;//Ò»°ãÉèÖÃΪ9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæÅ¼Ð£Ñéλ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½ USART_Init(USART3, &USART_InitStructure); //³õʼ»¯´®¿Ú 3 USART_Cmd(USART3, ENABLE); //ʹÄÜ´®¿Ú //ʹÄܽÓÊÕÖÐ¶Ï USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÖÐ¶Ï NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//ÇÀÕ¼ÓÅÏȼ¶2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ #endif GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(ESP01S_RST_RCC_CLK, ENABLE); //ʹÄÜA¶Ë¿ÚʱÖÓ GPIO_InitStructure.GPIO_Pin = ESP01S_RST_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//ËÙ¶È50MHz GPIO_Init(ESP01S_RST_PROT, &GPIO_InitStructure); //³õʼ»¯GPIOA GPIO_ResetBits(ESP01S_RST_PROT,ESP01S_RST_PIN);//esp8266µÍµçƽ¸´Î» delay_ms(200); GPIO_SetBits(ESP01S_RST_PROT,ESP01S_RST_PIN); ESP8266_Clear(); OLED_ShowCHinese(0, 3,15);//Õý OLED_ShowCHinese(18,3,16);//ÔÚ OLED_ShowCHinese(36,3,17);//Á¬ OLED_ShowCHinese(54,3,18);//½Ó OLED_ShowString (72,3,"WIFI",16); OLED_ShowString (108,3,"..",16); OLED_ShowCHinese(0, 6, 19);//½ø OLED_ShowCHinese(18,6, 20);//¶È OLED_ShowCHinese(36,6,21);//£º // printf("1. AT\r\n"); OLED_ShowString(44,6,"10%",16); while(ESP8266_SendCmd("AT\r\n","OK")&&Flagout) delay_ms(100); // printf("2. CWMODE\r\n"); OLED_ShowString(44,6,"20%",16); while(ESP8266_SendCmd("AT+CWMODE=3\r\n", "OK")&&Flagout) delay_ms(100); // printf( "3. Á¬½Ó·ÓÉÆ÷¡£\r\n"); OLED_ShowString(44,6,"30%",16); while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "OK")&&Flagout) delay_ms(100); // printf("4. ¿ªÆô͸Ã÷´«Êäģʽ¡£\r\n"); OLED_ShowString(44,6,"30%",16); while(ESP8266_SendCmd("AT+CIPMODE=1\r\n", "OK")&&Flagout) delay_ms(100); // printf( "5. Á¬½Ó°Í·¨ÔÆ¡£\r\n"); OLED_ShowString(44,6,"50%",16); while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")&&Flagout) delay_ms(100); // printf( "6. ½øÈë͸´«Ä£Ê½£¬ÏÂÃæ·¢µÄ¶¼»áÎÞÌõ¼þ´«Êä¡£\r\n"); OLED_ShowString(44,6,"80%",16); while(ESP8266_SendCmd("AT+CIPSEND\r\n", "OK")&&Flagout) delay_ms(100); // printf( "7.¶©ÔÄÖ÷Ìâ¡£\r\n"); OLED_ShowString(44,6,"90%",16); while(ESP8266_SendCmd(ESP8266_TOPIC, "cmd=1&res=1")&&Flagout) delay_ms(100); Flagout=3; // printf("8. ESP8266 ³õʼ»¯Íê³É£¡\r\n"); OLED_ShowString(44,6,"100%",16); Flagout=0; delay_ms(2000); ESP8266_Clear(); OLED_Clear(0); } //========================================================== // º¯ÊýÃû³Æ£º ESP8266_WaitRecive // // º¯Êý¹¦ÄÜ£º µÈ´ý½ÓÊÕÍê³É // // Èë¿Ú²ÎÊý£º ÎÞ // // ·µ»Ø²ÎÊý£º REV_OK-½ÓÊÕÍê³É REV_WAIT-½ÓÊÕ³¬Ê±Î´Íê³É // // ˵Ã÷£º Ñ­»·µ÷Óüì²âÊÇ·ñ½ÓÊÕÍê³É //========================================================== _Bool ESP8266_WaitRecive(void) { if(esp8266_cnt == 0) //Èç¹û½ÓÊÕ¼ÆÊýΪ0 Ôò˵Ã÷ûÓд¦ÓÚ½ÓÊÕÊý¾ÝÖУ¬ËùÒÔÖ±½ÓÌø³ö£¬½áÊøº¯Êý return REV_WAIT; if(esp8266_cnt == esp8266_cntPre) //Èç¹ûÉÏÒ»´ÎµÄÖµºÍÕâ´ÎÏàͬ£¬Ôò˵Ã÷½ÓÊÕÍê±Ï { esp8266_cnt = 0; //Çå0½ÓÊÕ¼ÆÊý return REV_OK; //·µ»Ø½ÓÊÕÍê³É±êÖ¾ } esp8266_cntPre = esp8266_cnt; //ÖÃΪÏàͬ return REV_WAIT; //·µ»Ø½ÓÊÕδÍê³É±êÖ¾ } /************************************************************ * º¯ÊýÃû³Æ£º Usart_SendString * * º¯Êý¹¦ÄÜ£º ´®¿ÚÊý¾Ý·¢ËÍ * * Èë¿Ú²ÎÊý£º USARTx£º´®¿Ú×é * str£ºÒª·¢Ë͵ÄÊý¾Ý * len£ºÊý¾Ý³¤¶È * * ·µ»Ø²ÎÊý£º ÎÞ * * ˵Ã÷£º ************************************************************ */ void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len) { unsigned short count = 0; for(; count < len; count++) { USART_SendData(USARTx, *str++); //·¢ËÍÊý¾Ý while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); //µÈ´ý·¢ËÍÍê³É } } //========================================================== // º¯ÊýÃû³Æ£º ESP8266_SendCmd // // º¯Êý¹¦ÄÜ£º ·¢ËÍÃüÁî // // Èë¿Ú²ÎÊý£º cmd£ºÃüÁî // res£ºÐèÒª¼ì²éµÄ·µ»ØÖ¸Áî // // ·µ»Ø²ÎÊý£º 0-³É¹¦ 1-ʧ°Ü // // ˵Ã÷£º //========================================================== _Bool ESP8266_SendCmd(char *cmd, char *res) { unsigned char timeOut = 200; Usart_SendString(Bamfa_USART, (unsigned char *)cmd, strlen((const char *)cmd)); while(timeOut--) { if(ESP8266_WaitRecive() == REV_OK) //Èç¹ûÊÕµ½Êý¾Ý { if(strstr((const char *)esp8266_buf, res) != NULL) //Èç¹û¼ìË÷µ½¹Ø¼ü´Ê { ESP8266_Clear(); //Çå¿Õ»º´æ return 0; } } delay_ms(10); } return 1; } //========================================================== // º¯ÊýÃû³Æ£º ESP8266_SendData // // º¯Êý¹¦ÄÜ£º ·¢ËÍÊý¾Ý // // Èë¿Ú²ÎÊý£º data£ºÊý¾Ý // len£º³¤¶È // // ·µ»Ø²ÎÊý£º ÎÞ // // ˵Ã÷£º //========================================================== void ESP8266_SendData(unsigned char *data) { ESP8266_Clear(); //Çå¿Õ½ÓÊÕ»º´æ Usart_SendString(Bamfa_USART, (unsigned char *)data, strlen((const char *)data)); //·¢ËÍÉ豸Á¬½ÓÇëÇóÊý¾Ý } //========================================================== // º¯ÊýÃû³Æ£º USART2_IRQHandler // // º¯Êý¹¦ÄÜ£º ´®¿Ú2ÊÕ·¢ÖÐ¶Ï // // Èë¿Ú²ÎÊý£º ÎÞ // // ·µ»Ø²ÎÊý£º ÎÞ // // ˵Ã÷£º //========================================================== #if Bamfa_USART1 void USART1_IRQHandler(void) { if(USART_GetITStatus(Bamfa_USART, USART_IT_RXNE) != RESET) //½ÓÊÕÖÐ¶Ï { if(esp8266_cnt >= sizeof(esp8266_buf)) esp8266_cnt = 0; //·ÀÖ¹´®¿Ú±»Ë¢±¬ esp8266_buf[esp8266_cnt++] = USART_ReceiveData(Bamfa_USART); } USART_ClearFlag(Bamfa_USART, USART_FLAG_RXNE); } #elif Bamfa_USART2 void USART2_IRQHandler(void) { if(USART_GetITStatus(Bamfa_USART, USART_IT_RXNE) != RESET) //½ÓÊÕÖÐ¶Ï { if(esp8266_cnt >= sizeof(esp8266_buf)) esp8266_cnt = 0; //·ÀÖ¹´®¿Ú±»Ë¢±¬ esp8266_buf[esp8266_cnt++] = USART_ReceiveData(Bamfa_USART); } USART_ClearFlag(Bamfa_USART, USART_FLAG_RXNE); } #elif Bamfa_USART3 void USART3_IRQHandler(void) { if(USART_GetITStatus(Bamfa_USART, USART_IT_RXNE) != RESET) //½ÓÊÕÖÐ¶Ï { if(esp8266_cnt >= sizeof(esp8266_buf)) esp8266_cnt = 0; //·ÀÖ¹´®¿Ú±»Ë¢±¬ esp8266_buf[esp8266_cnt++] = USART_ReceiveData(Bamfa_USART); } USART_ClearFlag(Bamfa_USART, USART_FLAG_RXNE); } #endif 帮我根据以上代码生成流程框图

/***************STM32F103C8T6********************** * ÎļþÃû £ºusart1.c * ÃèÊö £º½«printfº¯ÊýÖØ¶¨Ïòµ½USART1¡£ * Ó²¼þÁ¬½Ó£º------------------------ * | PA9 - USART1(Tx) | * | PA10 - USART1(Rx) | * ------------------------ * ¿â°æ±¾ £ºST3.0.0 * ********************LIGEN*************************/ #include "usart.h" #include <stdarg.h> extern int T_CO,T_light; void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /************/ NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//?????3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //????3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ???? NVIC_Init(&NVIC_InitStructure); //??????????VIC??? /***********/ /* ʹÄÜ USART1 ʱÖÓ*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); /* USART1 ʹÓÃIO¶Ë¿ÚÅäÖà */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë GPIO_Init(GPIOA, &GPIO_InitStructure); //³õʼ»¯GPIOA /* USART1 ¹¤×÷ģʽÅäÖà */ USART_InitStructure.USART_BaudRate = 115200; //²¨ÌØÂÊÉèÖãº115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //Êý¾ÝλÊýÉèÖãº8λ USART_InitStructure.USART_StopBits = USART_StopBits_1; //ֹͣλÉèÖãº1λ USART_InitStructure.USART_Parity = USART_Parity_No ; //ÊÇ·ñÆæÅ¼Ð£Ñ飺ÎÞ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Ó²¼þÁ÷¿ØÖÆÄ£Ê½ÉèÖãºÃ»ÓÐʹÄÜ USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//½ÓÊÕÓë·¢ËͶ¼Ê¹ÄÜ USART_Init(USART1, &USART_InitStructure); //³õʼ»¯USART1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//???????? USART_Cmd(USART1, ENABLE);// USART1ʹÄÜ } /* ÃèÊö £ºÖض¨Ïòc¿âº¯Êýprintfµ½USART1*/ int fputc(int ch, FILE *f) { /* ½«PrintfÄÚÈÝ·¢Íù´®¿Ú */ USART_SendData(USART1, (unsigned char) ch); while (!(USART1->SR & USART_FLAG_TXE)); return (ch); } void USART1_IRQHandler(void) //??1?????? { static uint8_t RxState = 0; uint8_t RxData = USART_ReceiveData(USART1); if (RxState == 0) { if (RxData == '@') { RxState = 1; } } else if (RxState == 1) { if (RxData == '\r') RxState = 2; else if (RxData == 'A') T_light-=20; else if (RxData == 'B') T_light+=20; else if (RxData == 'C') T_CO-=10; else if (RxData == 'D') T_CO+=10; } else if (RxState == 2) { if (RxData == '\n') { RxState = 0; } } USART_ClearITPendingBit(USART1, USART_IT_RXNE); }

最新推荐

recommend-type

学籍管理系统C语言实训报告.doc

学籍管理系统C语言实训报告.doc
recommend-type

东北大学2021年9月《计算机基础》作业考核试题及答案参考17.docx

东北大学2021年9月《计算机基础》作业考核试题及答案参考17.docx
recommend-type

如何做好软件销售及企业管理软件销售就业机会.doc

如何做好软件销售及企业管理软件销售就业机会.doc
recommend-type

基于单片机的恒流开关电源-新.doc

基于单片机的恒流开关电源-新.doc
recommend-type

基石油长输管道SCADA系统设计与研究的开题报告.docx

基石油长输管道SCADA系统设计与研究的开题报告.docx
recommend-type

全面解析SOAP库包功能与应用

从给定的文件信息中,我们可以提取到的核心知识点主要集中在“SOAP”这一项技术上,由于提供的信息量有限,这里将尽可能详细地解释SOAP相关的知识。 首先,SOAP代表简单对象访问协议(Simple Object Access Protocol),是一种基于XML的消息传递协议。它主要用于在网络上不同应用程序之间的通信。SOAP定义了如何通过HTTP和XML格式来构造消息,并规定了消息的格式应遵循XML模式。这种消息格式使得两个不同平台或不同编程语言的应用程序之间能够进行松耦合的服务交互。 在分布式计算环境中,SOAP作为一种中间件技术,可以被看作是应用程序之间的一种远程过程调用(RPC)机制。它通常与Web服务结合使用,Web服务是使用特定标准实现的软件系统,它公开了可以通过网络(通常是互联网)访问的API。当客户端与服务端通过SOAP进行通信时,客户端可以调用服务端上特定的方法,而不需要关心该服务是如何实现的,或者是运行在什么类型的服务器上。 SOAP协议的特点主要包括: 1. **平台无关性**:SOAP基于XML,XML是一种跨平台的标准化数据格式,因此SOAP能够跨越不同的操作系统和编程语言平台进行通信。 2. **HTTP协议绑定**:虽然SOAP协议本身独立于传输协议,但是它通常与HTTP协议绑定,这使得SOAP能够利用HTTP的普及性和无需额外配置的优势。 3. **消息模型**:SOAP消息是交换信息的载体,遵循严格的结构,包含三个主要部分:信封(Envelope)、标题(Header)和正文(Body)。信封是消息的外壳,定义了消息的开始和结束;标题可以包含各种可选属性,如安全性信息;正文则是实际的消息内容。 4. **错误处理**:SOAP提供了详细的错误处理机制,可以通过错误码和错误信息来描述消息处理过程中的错误情况。 5. **安全性和事务支持**:SOAP协议可以集成各种安全性标准,如WS-Security,以确保消息传输过程中的安全性和完整性。同时,SOAP消息可以包含事务信息,以便于服务端处理事务性的业务逻辑。 在描述中提到的“所有库包”,这可能意味着包含了SOAP协议的实现、相关工具集或库等。由于信息不足,这里的“库包”具体指的是什么并不清楚,但可以理解为与SOAP相关的软件开发工具包(SDK)或框架,它们使得开发者可以更加方便地创建SOAP消息,处理SOAP请求和响应,以及实现Web服务。 至于“压缩包子文件的文件名称列表”中只有一个单词“soap”,这可能表明实际文件内容仅有一个与SOAP相关的文件,或者是一个压缩包文件的名称为“soap”。由于缺乏更详尽的文件列表,无法进一步分析其可能的内容。 综上所述,SOAP作为一种实现Web服务的技术标准,通过HTTP和XML实现系统间的通信。它支持跨平台、跨语言的服务调用,并具备强大的安全性和错误处理机制。在具体应用中,开发者可能需要用到与之相关的库包或工具集来开发和部署Web服务。
recommend-type

编程语言选择指南:为不同项目量身定制的编程语言策略

# 摘要 选择合适的编程语言对于软件项目的成功至关重要。本文首先探讨了编程语言选择的重要性,并对不同分类和特点的编程语言进行了详尽分析,重点介绍了静态与动态类型、解释型与编译型、面向对象与函数式编程语言的区别和应用场景。接着,文章根据项目需求详细讨论了如何选择适合的编程语言,包括功能需求、性能考量、开发效率和团队技能等关键因素。通过实践案例分析,本文进一步探讨了不同
recommend-type

手写vue2的插件vue-router

<think>我们正在手写一个简化版的vue-router插件,用于Vue2。主要步骤:1.定义一个类VueRouter,包含路由映射、当前路由状态等。2.实现install方法,用于Vue.use()安装插件,在install方法中:-混入beforeCreate生命周期钩子,在组件创建时初始化router。-全局注册router-view和router-link组件。3.实现路由映射:将路由配置转换为路径与组件的映射表。4.监听hashchange事件(或者使用history模式,这里以hash模式为例)来响应路由变化。5.实现router-view组件,根据当前路由渲染对应组件。6.实现
recommend-type

《软件工程:实践者的方法》第6版课件解析

根据提供的文件信息,我们可以推断出以下知识点: 1. 课程名称:“SOFTWARE ENGINEERING A practitioner's approach 6e”,表明这是关于软件工程的课程教材,第6版,针对实践者的教学方法。 2. 版本信息:由于标题中明确指出是第6版(6e),我们知道这是一系列教科书或课件的最新版本,这意味着内容已经根据最新的软件工程理论和实践进行了更新和改进。 3. 课程类型:课程是针对“practitioner”,即实践者的,这表明教材旨在教授学生如何将理论知识应用于实际工作中,注重解决实际问题和案例学习,可能包含大量的项目管理、需求分析、系统设计和测试等方面的内容。 4. 适用范围:文件描述中提到了“仅供校园内使用”,说明这个教材是专为教育机构内部学习而设计的,可能含有某些版权保护的内容,不允许未经授权的外部使用。 5. 标签:“SOFTWARE ENGINEERING A practitioner's approach 6e 软件工程”提供了关于这门课程的直接标签信息。标签不仅重复了课程名称,还强化了这是关于软件工程的知识。软件工程作为一门学科,涉及软件开发的整个生命周期,从需求收集、设计、编码、测试到维护和退役,因此课程内容可能涵盖了这些方面。 6. 文件命名:压缩包文件名“SftEng”是“SOFTWARE ENGINEERING”的缩写,表明该压缩包包含的是软件工程相关的教材或资料。 7. 关键知识点:根据标题和描述,我们可以推测课件中可能包含的知识点有: - 软件工程基础理论:包括软件工程的定义、目标、原则和软件开发生命周期的模型。 - 需求分析:学习如何获取、分析、记录和管理软件需求。 - 系统设计:涉及软件架构设计、数据库设计、界面设计等,以及如何将需求转化为设计文档。 - 实现与编码:包括编程语言的选择、代码编写规范、版本控制等。 - 测试:软件测试的原则、方法和测试用例的设计。 - 项目管理:时间管理、团队协作、风险管理、成本估算等与软件项目成功相关的管理活动。 - 质量保证:软件质量模型、质量度量和质量控制措施。 - 维护和演化:软件部署后如何进行持续维护、升级和系统退役。 - 软件工程的新兴领域:包括敏捷开发方法、DevOps、用户体验设计等现代软件开发趋势。 8. 版权和使用限制:由于是专供校园内使用的教材,课件可能包含版权声明和使用限制,要求用户在没有授权的情况下不得对外传播和用于商业用途。 综上所述,这门课程的课件是为校园内的学生和教职员工设计的,关于软件工程的全面教育材料,覆盖了理论知识和实践技巧,并且在版权方面有所限制。由于是最新版的教材,它很可能包含了最新的软件工程技术和方法论。
recommend-type

QUARTUS II 13.0全攻略:新手到专家的10个必备技能

# 摘要 本文旨在详细介绍QUARTUS II 13.0软件的使用,包括其安装、FPGA基础、项目设置、设计流程、高级功能应用