建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

jxhello

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-12-2 16:48:17 2727 5 楼主 显示全部楼层
[技术探讨] 命令下发不成功,找原因?

我在朱老师最后一个视频“30分钟开发”提供的实验代码里修改了一点main.c如下:红字部分是我修改的,可是当我从云端下发命令,然后串口调试时却打印不出

"+NNMI:2,0001",也进入不了红色if 语句部分,即执行不到printf("yuan");而在云端“我的设备”里是能够看到我发的命令记录。
我也单独使用NB与USB转串口节电脑,当我从云端发送命令时,串口能打印出"+NNMI:2,0001"。请问我哪里出了问题呢?
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32l4xx_hal.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */
#include "dht11.h"
#include <string.h>

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
DHT11_Data_TypeDef dht11;
uint8_t hlpuart1_buffer[131] = {0};
uint8_t hlpuart1_buff_index = 0;
uint8_t hlpuart1_rec_char = 0;
uint8_t rec_cmd_gpson[]  = "+NNMI:2,0001";

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */

int main(void)

{

  /* USER CODE BEGIN 1 */

uint8_t atBuf[50] = {0};

  /* USER CODE END 1 */


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


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */

HAL_Delay(1000);

HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT+nnmi=1\r\n", 11);

HAL_Delay(1000);

  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_LPUART1_UART_Init();

  MX_USART1_UART_Init();

HAL_UART_Receive_IT(&hlpuart1, &hlpuart1_rec_char, 1);

  /* USER CODE BEGIN 2 */

DHT11_Init();

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

DHT11_Read_TempAndHumidity(&dht11);

printf("temp = %.2f ; humi = %.2f\r\n",dht11.temperature,dht11.humidity);

HAL_Delay(3000);

sprintf(&atBuf[0], "AT+NMGS=5,04%08x\r\n", (int)(dht11.temperature*100));

HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)&atBuf[0], 22);

// printf("%s, lenth=%d", &atBuf[0], strlen(&atBuf[0]));

// HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT+NMGS=5,0000000034\r\n", 17);

// HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT\r\n", 4);

// HAL_Delay(1000);

//HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT+CSQ\r\n", 8);

//HAL_Delay(1000);

// HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT+CGATT?\r\n", 11);

// HAL_Delay(3000);

// HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT+NCDP?\r\n", 10);

// HAL_Delay(3000);

// HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT+CMEE=1\r\n", 11);

// HAL_Delay(3000);

// HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)"AT+NMGS=5,0000000034\r\n", 22);

  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */


if(strstr(hlpuart1_buffer, rec_cmd_gpson) != NULL)//????GPS???

{HAL_Delay(1000);

printf("yuan");

memset(hlpuart1_buffer, 0,131);

}

  /* USER CODE END 3 */

}

}


/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{


  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_PeriphCLKInitTypeDef PeriphClkInit;


    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;

  RCC_OscInitStruct.MSIState = RCC_MSI_ON;

  RCC_OscInitStruct.MSICalibrationValue = 0;

  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;

  RCC_OscInitStruct.PLL.PLLM = 1;

  RCC_OscInitStruct.PLL.PLLN = 18;

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;

  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;

  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;


  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_LPUART1;

  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

  PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


    /**Configure the main internal regulator output voltage 

    */

  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }


    /**Configure the Systick interrupt time 

    */

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);


    /**Configure the Systick 

    */

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);


  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}


/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//BC95½ÓÊÕÖжϣ¬´¦ÀíÊÕµ½µÄÃüÁî

{

if(huart->Instance == LPUART1)

{

printf("%c",hlpuart1_rec_char);

if(hlpuart1_rec_char == 0x0a)

{

hlpuart1_buff_index = 20;

}else if(hlpuart1_rec_char == '+')

{

hlpuart1_buff_index = 0;

}

hlpuart1_buffer[hlpuart1_buff_index] = hlpuart1_rec_char;

hlpuart1_buff_index++;


//while(HAL_UART_Receive_IT(&hlpuart1, &hlpuart1_rec_char, 1) != HAL_OK);//????

}

}


举报
分享

分享文章到朋友圈

分享文章到微博

科技植

发帖: 10粉丝: 3

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2018-12-2 17:05:00 沙发 显示全部楼层

你最后一句代码,

//while(HAL_UART_Receive_IT(&hlpuart1, &hlpuart1_rec_char, 1) != HAL_OK);//????

去掉注释

点赞 回复 举报

jxhello

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2018-12-2 20:01:50 板凳 显示全部楼层

最后一行去掉注释也不行,不过去注释后串口会打印出“OK”,应当是上报数据成功后(HAL_UART_Transmit_IT(&hlpuart1, (uint8_t *)&atBuf[0], 22)),NB模块向CPU的回答,但是云端下发的命令CPU收不到!

点赞 回复 举报

科技植

发帖: 10粉丝: 3

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2018-12-2 20:50:26 地板 显示全部楼层

你代码里的第二个错误,如图

image.png


你应该把紫色框的内容放到红色箭头的位置,而且应该在发送之前延时5秒,因为模块刚被上电,处于初始化状态,你程序一开始就通过串口对NB模块进行设置,是设置不成功的

点赞 回复 举报

包包大人

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-2-21 20:39:08 5# 显示全部楼层
成功了吗,兄弟
点赞 回复 举报

科技植

发帖: 10粉丝: 3

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2019-2-22 10:46:24 6# 显示全部楼层

应该是成功了。不然它会继续留言提问的

点赞 回复 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册