【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>
最后上一下整个工程:
多谢分享 占个前排 不错,快来围观 学习了 shao150933 发表于 2015-5-28 23:59
不错,快来围观
多谢支持 谢谢分享 20金币已奖励 沐紫 发表于 2015-5-29 10:02
20金币已奖励
多谢打赏:)继续努力 多谢分享!