lkl0305 发表于 2015-5-28 23:30:53

【Nucleo-F303RE开发】分享个自己写的串口控制Led程序

在上一篇(UART中断发送数据)中,解决了UART串口中断发送接收数据问题后。今天给大家分享一个简单的串口控制板上的led的程序了。

里面用到的串口中断发送数据的方法可以看我的另一个帖子:
【Nucleo-F303RE开发】UART中断发送数据
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=601861&fromuid=336767
(出处: 意法半导体STM32/STM8技术社区)

一、功能描述:
本次要做的是一个简单的是用串口控制Nucleo-F303RE上LED的亮灭,具体功能描述如下:
1、首先Nucleo-F303RE向电脑发送提示信息:

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

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

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

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

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

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


二、程序分析:
主要程序分析,其实功能很简单,来看看主函数:
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, RXBUFFERSIZE) == 0)   //亮灯
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    return 1;
}
else if (Commandcmp(Command, (uint8_t *)Command_Lib, RXBUFFERSIZE) == 0)//灭灯
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
    return 1;
}
else if (Commandcmp(Command, (uint8_t *)Command_Lib, RXBUFFERSIZE) == 0)//反转灯
{
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    return 1;
}
else if (Commandcmp(Command, (uint8_t *)Command_Lib, RXBUFFERSIZE) == 0)//查询状态
{
    if ((GPIOA->ODR & GPIO_PIN_5) != (uint32_t)GPIO_PIN_RESET)
    {
      return 2; //亮
    }
    else
    {
      return 3;//灭
    }
}
else
{
    return 0;//无法识别命令
}
}</p>
最后上一下整个工程:

Paderboy 发表于 2015-5-28 23:37:56

多谢分享

风子 发表于 2015-5-28 23:57:31

占个前排

shao150933 发表于 2015-5-28 23:59:06

不错,快来围观

你好我好大家好! 发表于 2015-5-29 00:18:58

学习了               

lkl0305 发表于 2015-5-29 08:11:14

shao150933 发表于 2015-5-28 23:59
不错,快来围观

多谢支持

为什么是EEFOCUS小白 发表于 2015-5-29 08:50:11

谢谢分享      

沐紫 发表于 2015-5-29 10:02:56

20金币已奖励

lkl0305 发表于 2015-5-29 10:59:00

沐紫 发表于 2015-5-29 10:02
20金币已奖励

多谢打赏:)继续努力

summersick 发表于 2016-1-29 14:56:59

多谢分享!
页: [1] 2 3
查看完整版本: 【Nucleo-F303RE开发】分享个自己写的串口控制Led程序