STM32驱动BC260Y连接阿里云平台并上报物模型数据

BC260Y连接阿里云平台

本次实验用到移远BC260Y-CN芯片连接阿里云平台进行物模型数据上传,利用STM32L051C8T6与BC260Y模组进行连接。

一、硬件连接

STM32L051C8T6          BC260Y
                     5V          VIN
                    GND          GND
                     TX           RXD
                     RX           TXD

硬件实物图

二、代码及介绍

1.串口初始化:程序中利用串口2来打印出BC260Y模块返回的响应信息,串口1用来向BC260Y发送AT指令。

usart.c

#include "usart.h"

/* USER CODE BEGIN 0 */
#include "string.h"
#include "stdio.h"

UARTTYPE uartType1,uartType2;

#if 1
#pragma import(__use_no_semihosting)

struct __FILE
{
	int handle;
};

FILE __stdout;

void _sys_exit(int x)
{
	x=x;
}

int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);
	   return  ch;
}

int fgetc(FILE *f)
{
	uint8_t ch = 0;
	HAL_UART_Receive(&huart2,&ch,1,0xffff);
	return ch ;
}
#endif

HAL_StatusTypeDef status;
/* USER CODE END 0 */

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_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;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */
 __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  /* 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.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */
 __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
  /* USER CODE END USART2_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_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 DMA Init */
    /* USART1_RX Init */
    hdma_usart1_rx.Instance = DMA1_Channel3;
    hdma_usart1_rx.Init.Request = DMA_REQUEST_3;
    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_Channel2;
    hdma_usart1_tx.Init.Request = DMA_REQUEST_3;
    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, 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 */
    /* 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_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART2 DMA Init */
    /* USART2_RX Init */
    hdma_usart2_rx.Instance = DMA1_Channel5;
    hdma_usart2_rx.Init.Request = DMA_REQUEST_4;
    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_NORMAL;
    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
    if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);

    /* USART2_TX Init */
    hdma_usart2_tx.Instance = DMA1_Channel4;
    hdma_usart2_tx.Init.Request = DMA_REQUEST_4;
    hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart2_tx.Init.Mode = DMA_NORMAL;
    hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
    if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);

    /* USART2 interrupt Init */
    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
  /* 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);
    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 DMA DeInit */
    HAL_DMA_DeInit(uartHandle->hdmarx);
    HAL_DMA_DeInit(uartHandle->hdmatx);

    /* USART2 interrupt Deinit */
    HAL_NVIC_DisableIRQ(USART2_IRQn);
  /* USER CODE BEGIN USART2_MspDeInit 1 */

  /* USER CODE END USART2_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
void UART_Receive_IDLE(UART_HandleTypeDef *huart)
{
	uint32_t temp1;
	if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
	{ 
		__HAL_UART_CLEAR_IDLEFLAG(huart);
		HAL_UART_DMAStop(huart);
		temp1 = huart->hdmarx->Instance->CNDTR;
		if(huart->Instance == huart1.Instance)
		{
			uartType1.rxLen =  UARTRXLEN - temp1; 
			uartType1.idle=1;
			HAL_UART_Receive_DMA(&huart1,(uint8_t *)uartType1.rxBuf,UARTRXLEN);

		}
		if(huart->Instance==huart2.Instance)
		{	
			uartType2.rxLen =  UARTRXLEN - temp1; 
			uartType2.idle=1;
			HAL_UART_Receive_DMA(&huart2,(uint8_t *)uartType2.rxBuf,UARTRXLEN);

		}
	}
}



void Uart1_SendStr(char*SendBuf)
{
	while(*SendBuf != '\0')
	{
    status = HAL_UART_Transmit(&huart1,(uint8_t *)SendBuf,1,HAL_MAX_DELAY);
		if(status != HAL_OK)
		{
		}
		SendBuf++;
	}
}


/* USER CODE END 1 */

2.BC260Y初始化,MQTT初始化

strstr()函数 是C/C++标准库中的一个字符串处理函数,用于在一个字符串中查找另一个子字符串的第一次出现位置

BC260Y.c

#include "bc260y.h"
#include "usart.h"
#include "stdio.h"
#include "string.h"

char *strx,*extstrx;
char atstr[UARTRXLEN];
BC260Y BC260Y_Status;

只要修改三要素/
#define PRODUCEKEY "k0bbaj3J61l"        //修改产品秘钥
#define DEVICENAME "NBLX"           //修改设备名称
#define DEVICESECRET "816d9c9166fc012ab57ac0e3010d878a" //修改设备秘钥

#define PubTopic        "/sys/k0bbaj3J61l/NBLX/thing/event/property/post"//发布主题
#define SubTopic        "/sys/k0bbaj3J61l/NBLX/thing/service/property/set"//订阅主题
///

void Clear_Buffer(void)  //清空缓存
	{
		printf((const char *)uartType1.rxBuf);
		delay_ms(500);
		uartType1.idle=0;
		memset(uartType1.rxBuf,0,UARTRXLEN);
	}
	


void BC260Y_Init(void)
{
		Uart1_SendStr("AT+QRST=?\r\n");
		delay_ms(2000);
		printf((const char *)uartType1.rxBuf);
//		strx=strstr((const char *)uartType1.rxBuf,(const char *)"OK");
		Clear_Buffer();	
	
		Uart1_SendStr("ATI\r\n");
		delay_ms(500);
		printf((const char *)uartType1.rxBuf);
		strx=strstr((const char *)uartType1.rxBuf,(const char *)"OK");
		Clear_Buffer();

		Uart1_SendStr("AT+QSCLK=0\r\n");   //禁止休眠
		delay_ms(500);
	  printf(uartType1.rxBuf);
	
    Uart1_SendStr("AT+CFUN=1\r\n");    //打开全功能模式
    delay_ms(500);
    printf(uartType1.rxBuf);
	
    Uart1_SendStr("AT+CIMI\r\n");   //获取卡号,类似是否存在卡的意思,比较重要。
    delay_ms(500);
    strx=strstr((const char*)uartType1.rxBuf,(const char*)"ERROR");//返460,表明识别到卡了		
		
    if(strx==NULL)
		{
				printf("我的卡号是:%s \r\n",&uartType1.rxBuf[11]);
				Clear_Buffer();	
		}
		else
		{
				printf("卡错误: %s \r\n",uartType2.rxBuf);
				Clear_Buffer();
		}
		
		Uart1_SendStr("AT+CGATT=1\r\n");//激活网络,PDP
		delay_ms(500);
		strx=strstr((const char*)uartType1.rxBuf,(const char*)"OK");//返OK
		Clear_Buffer();	
		
		Uart1_SendStr("AT+CGATT?\r\n");//查询激活状态
//		 printf("AT+CGATT?\r\n");
		delay_ms(500);
		printf("recv=%s \r\n",uartType1.rxBuf);
		strx=strstr((const char*)uartType1.rxBuf,(const char*)"+CGATT: 1");//返1

//	 while(strx==NULL)
//		{
//				Clear_Buffer();	
//				Uart1_SendStr("AT+CGATT?\r\n");//获取激活状态
//				delay_ms(1000);
//				printf("recv=%s \r\n",uartType1.rxBuf);
//				strx=strstr((const char*)uartType1.rxBuf,(const char*)"+CGATT: 1");//返回1,表明注网成功
//		}
		
			Uart1_SendStr("AT+CSQ\r\n");//查看获取CSQ值
			delay_ms(500);
		 strx=strstr((const char*)uartType1.rxBuf,(const char*)"+CSQ");
		 if(strx)
		 {
			 printf("信号质量:%s\r\n", uartType1.rxBuf);
			 Clear_Buffer();
			 delay_ms(500);
		 }
			Clear_Buffer();	
}
	
char ServerIP[128]={0};

void  MQTT_Init(void)    //MQTT初始化
{
			memset(atstr,0,UARTRXLEN);
			sprintf(atstr,"AT+QMTCFG=\"aliauth\",0,\"%s\",\"%s\",\"%s\"\r\n",PRODUCEKEY,DEVICENAME,DEVICESECRET);
			printf("atstr = %s \r\n",atstr);
			Uart1_SendStr(atstr);//发送阿里云配置参数
			delay_ms(1000);  //等待300ms反馈OK
			printf("recv = %s \r\n",uartType1.rxBuf);
			strx=strstr((const char*)uartType1.rxBuf,(const char*)"OK");//返OK

			while(strx==NULL)
			{
					delay_ms(100);
					strx=strstr((const char*)uartType1.rxBuf,(const char*)"OK");//返OK 
			}

			Clear_Buffer();
			
			sprintf(ServerIP,"AT+QMTOPEN=0,\"%s.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n",PRODUCEKEY);
			printf("atstr = %s \r\n",ServerIP);
			Uart1_SendStr(ServerIP);//登录阿里云平台
			
			delay_ms(1000);
			printf("recv = %s \r\n",uartType1.rxBuf);
			strx=strstr((const char*)uartType1.rxBuf,(const char*)"+QMTOPEN: 0,0");//返+QMTOPEN: 0,0
			while(strx==NULL)
			{
				delay_ms(100);
				strx=strstr((const char*)uartType1.rxBuf,(const char*)"+QMTOPEN: 0,0");//确认返回值正确
			}
			
			Clear_Buffer(); 			
			memset(atstr,0,UARTRXLEN);
			
			sprintf(atstr,"AT+QMTCONN=0,\"%s\"\r\n",DEVICENAME);  //|securemode=3,signmethod=hmacsha1|
			printf("atstr = %s \r\n",atstr);
			Uart1_SendStr(atstr);//发送链接到阿里云
			delay_ms(500);
			printf("recv = %s \r\n",uartType1.rxBuf);
			strx=strstr((const char*)uartType1.rxBuf,(const char*)"+QMTCONN: 0,0,0");//返+QMTCONN: 0,0,0
			while(strx==NULL)
			{
					strx=strstr((const char*)uartType1.rxBuf,(const char*)"+QMTCONN: 0,0,0");//返+QMTCONN: 0,0,0

			}
			Clear_Buffer();
}


void aliyunMQTT_PUBdata(uint8_t TiltValue,uint8_t CoverState)   //向云端发送数据
{
		 uint8_t t_payload[200],len;
     sprintf(atstr,"AT+QMTPUB=0,0,0,0,%s\r\n",PubTopic);//发布主题
	   printf("atstr = %s",atstr);
	   Uart1_SendStr(atstr);
     delay_ms(500);
	   strx=strstr((const char*)uartType1.rxBuf,(const char *)">");
		while(strx==NULL)
		{
				strx=strstr((const char*)uartType1.rxBuf,(const char*)">");//返>

		}
			Clear_Buffer();
			
     len=Mqtt_Savedata(t_payload,TiltValue,CoverState);
     t_payload[len+1]=0x00;
	 
			sprintf(atstr,"%s",t_payload);
	   	printf("atstr = %s \r\n",atstr);
	    Uart1_SendStr(atstr);
	    delay_ms(300);
			
			while((USART1->ISR&0X40)==0){}		
		  USART1->TDR=(uint8_t )0x1A;
			
		
      delay_ms(100);
     strx=strstr((const char*)uartType1.rxBuf,(const char*)"+QMTPUB: 0,0,0");//看下返回状态
		while(strx==NULL)
    {
			delay_ms(300);
      strx=strstr((const char*)uartType1.rxBuf,(const char*)"+QMTPUB: 0,0,0");//看下返回状态
    }
    Clear_Buffer(); 
}



//访问阿里云需要提交JSON数据
uint8_t Mqtt_Savedata(uint8_t*t_payload,uint8_t TiltValue,uint8_t CoverState)
{
	//	char json[]="{\"id\":\"26\",\"version\":\"1.0\",\"params\":{\"CoverState\":\"value\":%d,\"TiltValue\":\"value\":%d.3},\"method\":\"thing.event.property.post\"}";
	  char json[]="{\"id\":\"28\",\"version\":\"1.0\",\"params\":{\"CoverState\":{\"value\":%d},\"TiltValue\":{\"value\":%d.2}},\"method\":\"thing.event.property.post\"}";
	
		char t_json[200];
    unsigned short json_len;
    sprintf(t_json, json,CoverState, TiltValue);
    json_len = strlen(t_json)/sizeof(char);
  	memcpy(t_payload, t_json, json_len);
    return json_len;
}

3.主函数的while中实现数据的发布与上传

  uint8_t TiltValue, CoverState; 分别为井盖倾斜度和井盖状态两个物模型数据

int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t TiltValue, CoverState;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();
  delay_init(72);
  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();  //串口1初始化
  MX_USART2_UART_Init();  //串口2初始化
  /* USER CODE BEGIN 2 */
     BC260Y_Init(); //BC260Y初始化
		 MQTT_Init();   //MQTT初始化
  /* USER CODE END 2 */
	
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	printf("BC26Y ALIYUN DEMO \r\n");
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		  CoverState=0;
		  TiltValue=22;
      aliyunMQTT_PUBdata(TiltValue,CoverState);  //上传数据
		  delay_ms(2000);
			delay_ms(2000);
			delay_ms(2000);

  }
  /* USER CODE END 3 */
}

4.结果显示

井盖状态和倾斜度数据上传成功

以下是使用STM32F103C8T6控制BC26上传数据阿里云平台的代码实现。 首先,需要安装BC26模块的驱动程序,并设置好串口通信参数。然后,需要配置阿里云平台的设备及数据流,并获取相应的信息。 接下来,可以参考以下代码实现数据的上传过程: ```c #include <stdio.h> #include <string.h> #include "stm32f10x.h" #define UART_TX_BUF_SIZE 512 #define UART_RX_BUF_SIZE 512 uint8_t uart_tx_buf[UART_TX_BUF_SIZE]; uint8_t uart_rx_buf[UART_RX_BUF_SIZE]; UART_HandleTypeDef uart_handle; void UART_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; // 使能 USART1 时钟 __HAL_RCC_USART1_CLK_ENABLE(); // 使能 GPIOA 时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 配置 PA9 引脚为复用推挽输出 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); // 配置 PA10 引脚为浮空输入 GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置串口参数 uart_handle.Instance = USART1; uart_handle.Init.BaudRate = 115200; uart_handle.Init.WordLength = UART_WORDLENGTH_8B; uart_handle.Init.StopBits = UART_STOPBITS_1; uart_handle.Init.Parity = UART_PARITY_NONE; uart_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; uart_handle.Init.Mode = UART_MODE_TX_RX; uart_handle.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&uart_handle) != HAL_OK) { // 初始化失败 while (1); } } void UART_SendData(const uint8_t *data, uint16_t len) { uint16_t i; if (len > UART_TX_BUF_SIZE) { // 数据长度超过缓冲区大小 return; } // 复制数据到发送缓冲区 memcpy(uart_tx_buf, data, len); // 发送数据 for (i = 0; i < len; i++) { while (__HAL_UART_GET_FLAG(&uart_handle, UART_FLAG_TXE) == RESET); uart_handle.Instance->DR = (uint8_t)(uart_tx_buf[i] & 0xFF); } // 等待发送完成 while (__HAL_UART_GET_FLAG(&uart_handle, UART_FLAG_TC) == RESET); } uint16_t UART_ReceiveData(uint8_t *data, uint16_t len) { uint16_t i; if (len > UART_RX_BUF_SIZE) { // 数据长度超过缓冲区大小 return 0; } // 接收数据 for (i = 0; i < len; i++) { while (__HAL_UART_GET_FLAG(&uart_handle, UART_FLAG_RXNE) == RESET); data[i] = (uint8_t)(uart_handle.Instance->DR & 0xFF); } return len; } void BC26_SendCommand(const char *cmd) { uint16_t len; // 发送命令 len = strlen(cmd); UART_SendData((const uint8_t *)cmd, len); // 等待响应 while (1) { len = UART_ReceiveData(uart_rx_buf, UART_RX_BUF_SIZE); if (len > 0) { // 处理响应 // TODO: 根据实际情况进行处理 break; } } } void BC26_Init(void) { // 初始化 BC26 模块 // TODO: 根据实际情况进行初始化 // 设置 APN BC26_SendCommand("AT+QICSGP=1,1,\"<APN>\",\"<USER>\",\"<PWD>\",1\r\n"); } void BC26_Connect(void) { // 连接阿里云平台 // TODO: 根据实际情况进行连接 } void BC26_SendData(const char *data) { // 发送数据阿里云平台 // TODO: 根据实际情况进行数据发送 } int main(void) { // 初始化串口 UART_Init(); // 初始化 BC26 模块 BC26_Init(); // 连接阿里云平台 BC26_Connect(); // 发送数据阿里云平台 BC26_SendData("<DATA>"); while (1) { // 主循环 } } ``` 需要注意的是,以上代码仅为示例代码,实际使用中需要根据具体情况进行修改。例如,需要根据阿里云平台数据格式进行数据组装,并使用相应的协议进行数据传输。同时,需要根据BC26模块的AT指令进行配置和数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值