在线时间250 小时
UID336767
ST金币0
蝴蝶豆1
注册时间2011-12-29
论坛元老
- 最后登录
- 2018-7-23
|
a0a.1 32b0c
在上一篇(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吧,没有修改
二、程序分析:
主要程序分析,其实功能很简单,来看看主函数:
- 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>
复制代码
最后上一下整个工程:
UART_LED.rar
(6.75 MB, 下载次数: 362)
|
|