HC_14lora模块如何在两个单片机上使用?
keil5 cubmax hal库,希望有代码演示谢谢
如何显示出接收和发送成功。
5条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-05-06 06:02关注
下午好🌅🌅🌅
本答案参考ChatGPT-3.5HC-14是一款应用于无线串口通信的模块,支持半双工传输,适用于物联网、智能家居、远程控制等领域。使用HC-14模块进行通信的前提是,必须在发送和接收两个设备间进行配对。
下面是HC-14模块在两个单片机上使用的解决方案:
-
确定通信协议:HC-14模块支持多种通信协议,如UART、SPI、I2C等,但常用的是UART协议。因此,需要在两个单片机上分别配置串口通信协议,包括波特率、数据位、校验位、停止位等参数,以保持通信一致。
-
配对HC-14模块: HC-14模块自带一个密钥,为保证通信时的数据安全,需要在发送和接收两个设备上分别将密钥设置为一致。
-
数据发送与接收:单片机通过串口发送数据,接收端通过串口接收数据。发送方要确保数据已打包为一条完整的信息包,接收方需要对接收到的数据进行解包。接收方再次向发送方发送应答信息。
-
防止数据丢失:为防止发送方发送的数据因某些原因丢失,接收方需要设置一个超时时间,超时之后终止等待并重新发送请求。
-
校验数据:在接收端对数据进行校验,如果发现数据错误,则需要向发送端发送错误信息并重新发送数据。
-
程序代码实现:在使用keil5开发环境中,需要使用cubmax hal库,调用UART和其他相关函数来实现HC-14在两个单片机间通信的功能。双方各自编写程序代码并进行调试测试。
参考代码如下:
发送端代码:
#include "cubemx_hal.h" #include <stdio.h> #define UART_TX_Pin GPIO_PIN_11 #define UART_TX_GPIO_Port GPIOA #define UART_RX_Pin GPIO_PIN_12 #define UART_RX_GPIO_Port GPIOA #define HC14_Key 0x9F UART_HandleTypeDef huart2; int main(void) { uint8_t temp=0; GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART2_CLK_ENABLE(); GPIO_InitStruct.Pin = UART_TX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(UART_TX_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = UART_RX_Pin; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(UART_RX_GPIO_Port, &GPIO_InitStruct); 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(); } while (1) { while(HAL_UART_Receive(&huart2, &temp, 1, 1000)!=HAL_OK); if(temp==HC14_Key){ //发送数据 uint8_t data[4] = {0x01, 0x02, 0x03, 0x04}; HAL_UART_Transmit(&huart2, data, 4, 1000); //发送4个数据 temp=0; //清空temp值 } } }
接收端代码:
#include "cubemx_hal.h" #include <stdio.h> #define UART_TX_Pin GPIO_PIN_11 #define UART_TX_GPIO_Port GPIOA #define UART_RX_Pin GPIO_PIN_12 #define UART_RX_GPIO_Port GPIOA #define HC14_Key 0x9F UART_HandleTypeDef huart2; int main(void) { uint8_t temp=0; uint8_t RxBuffer[4] = {0}; uint8_t cnt = 0; //接收数据计数 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART2_CLK_ENABLE(); GPIO_InitStruct.Pin = UART_TX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(UART_TX_GPIO_Port, &GPIO_InitStruct); GPIO_InitStruct.Pin = UART_RX_Pin; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(UART_RX_GPIO_Port, &GPIO_InitStruct); 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(); } while (1) { HAL_UART_Transmit(&huart2, &HC14_Key, 1, 1000); //发送HC-14密钥 while (1) //等待接收到数据 { if (HAL_UART_Receive(&huart2, &temp, 1, 1000) == HAL_OK) { RxBuffer[cnt++] = temp; } if (cnt == 4) //接收到4个数据 { printf("Receive Data: %d %d %d %d\n", RxBuffer[0], RxBuffer[1], RxBuffer[2], RxBuffer[3]); //发送应答信息 uint8_t response[4] = {0x05, 0x06, 0x07, 0x08}; HAL_UART_Transmit(&huart2, response, 4, 1000); cnt = 0; //计数变量清零 break; } } } }
以上是HC-14在两个单片机上使用的基本解决方案,使用时需要注意设置正确的通信协议,配对HC-14模块,防止数据丢失和校验数据等。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 3无用 -