w1nter.. 2024-04-30 18:39 采纳率: 50%
浏览 225
已结题

hc-14无线串口通信模块

HC_14lora模块如何在两个单片机上使用?
keil5 cubmax hal库,希望有代码演示谢谢
如何显示出接收和发送成功。

  • 写回答

5条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    HC-14是一款应用于无线串口通信的模块,支持半双工传输,适用于物联网、智能家居、远程控制等领域。使用HC-14模块进行通信的前提是,必须在发送和接收两个设备间进行配对。

    下面是HC-14模块在两个单片机上使用的解决方案:

    1. 确定通信协议:HC-14模块支持多种通信协议,如UART、SPI、I2C等,但常用的是UART协议。因此,需要在两个单片机上分别配置串口通信协议,包括波特率、数据位、校验位、停止位等参数,以保持通信一致。

    2. 配对HC-14模块: HC-14模块自带一个密钥,为保证通信时的数据安全,需要在发送和接收两个设备上分别将密钥设置为一致。

    3. 数据发送与接收:单片机通过串口发送数据,接收端通过串口接收数据。发送方要确保数据已打包为一条完整的信息包,接收方需要对接收到的数据进行解包。接收方再次向发送方发送应答信息。

    4. 防止数据丢失:为防止发送方发送的数据因某些原因丢失,接收方需要设置一个超时时间,超时之后终止等待并重新发送请求。

    5. 校验数据:在接收端对数据进行校验,如果发现数据错误,则需要向发送端发送错误信息并重新发送数据。

    6. 程序代码实现:在使用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模块,防止数据丢失和校验数据等。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月23日
  • 修改了问题 4月30日
  • 创建了问题 4月30日

悬赏问题

  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥20 python忆阻器数字识别
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api