打印
[STM32F3]

F303RE串口控制led

[复制链接]
1149|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
史迪威将军|  楼主 | 2016-1-30 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、功能描述:
本次要做的是一个简单的是用串口控制Nucleo-F303RE上LED的亮灭,具体功能描述如下:
1、首先Nucleo-F303RE向电脑发送提示信息:

2、可以看到目前可以使用的命令,可以在下面发送框中输入命令(必须为10字节的命令,程序问题,否则就会出错,还没有完善):

3、可以在下图中看到,输入要指令的命令,将Led点亮,然后可以看到串口返回执行正常信息。

4、输入查询命令,显示新的状态为亮

5、依次可以输入其他命令,下图是反转命令,没执行一次,Led灯的状态就改变一次::

6、如果输入错误指令,就会提示指令输入错误:

大家在使用程序时,一定要注意发送命令只能为10字节,命令后不能有回车等其他字符!不然就会执行错误,也算是个小bug吧,没有修改

沙发
史迪威将军|  楼主 | 2016-1-30 15:32 | 只看该作者
二、程序分析:
主要程序分析,其实功能很简单,来看看主函数:
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

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

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

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_UART_Transmit_IT(&huart2, (uint8_t *)TxBuffer, TXBUFFERSIZE);         //发送提示信息
    while (UartReady != SET)
    {
      ;
    }
   
    UartReady = RESET;
   
    HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, RXBUFFERSIZE);        //串口接收命令
   
    while (UartReady != SET)
    {
      ;
    }
   
    UartReady = RESET;
   
    switch (CommandHandle((uint8_t *)RxBuffer))               //根据串口接收的命令执行相应的命令,然后根据结果返回提示
    {
      case 0:          //返回不可识别的命令
        HAL_UART_Transmit_IT(&huart2, (uint8_t *)"不能识别的命令!\n\n\n", COUNTOF("不能识别的命令!\n\n\n"));
        break;
      case 1:      //返回执行正常命令
        HAL_UART_Transmit_IT(&huart2, (uint8_t *)"执行正常!\n\n\n", COUNTOF("执行正常!\n\n\n"));
        break;
      case 2:       //返回Led状态为亮信息
        HAL_UART_Transmit_IT(&huart2, (uint8_t *)"LED状态为:亮!\n\n\n", COUNTOF("LED状态为:亮!\n\n\n"));
        break;
      case 3:       //返回Led状态为灭信息
        HAL_UART_Transmit_IT(&huart2, (uint8_t *)"LED状态为:灭!\n\n\n", COUNTOF("LED状态为:灭!\n\n\n"));
        break;
      default:
        ;
    }
    while (UartReady != SET)
    {
      ;
    }
   
    UartReady = RESET;
   
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

其中根据命令执行控制灯程序为:
<p>static uint16_t Commandcmp(uint8_t* pCommand1, uint8_t* pCommand2, uint16_t CommandLength) //命令比较函数,其实字符串比较
{
  while (CommandLength)
  {
    if ((*pCommand1) != *pCommand2)
    {
      return CommandLength;
    }
    pCommand1++;
    pCommand2++;</p><p>    CommandLength--;
  }
  return 0;
}

static uint16_t CommandHandle(uint8_t* Command)    //命令处理
{
  if (Commandcmp(Command, (uint8_t *)Command_Lib[0], RXBUFFERSIZE) == 0)   //亮灯
  {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    return 1;
  }
  else if (Commandcmp(Command, (uint8_t *)Command_Lib[1], RXBUFFERSIZE) == 0)  //灭灯
  {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
    return 1;
  }
  else if (Commandcmp(Command, (uint8_t *)Command_Lib[2], RXBUFFERSIZE) == 0)  //反转灯
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    return 1;
  }
  else if (Commandcmp(Command, (uint8_t *)Command_Lib[3], RXBUFFERSIZE) == 0)  //查询状态
  {
    if ((GPIOA->ODR & GPIO_PIN_5) != (uint32_t)GPIO_PIN_RESET)
    {
      return 2; //亮
    }
    else
    {
      return 3;//灭
    }
  }
  else
  {
    return 0;//无法识别命令
  }
}</p>

使用特权

评论回复
板凳
奥德赛| | 2016-1-30 16:11 | 只看该作者
串口用的是中断模式还是扫描模式呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

291

帖子

0

粉丝