完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛扫一扫,分享给好友
|
所用型号:STM32F103ZET6 PA2,PA3是摁扭。 PA4,PA5是LED。 上一篇写了按键(GPIO输入)控制LED(GPIO输出),此次用上位机通过串口控制LED 流程 1.初始化由CubeMX完成 2.使用HAL库提供的阻塞接收函数 3.用到的串口发送/接收函数 (1)HAL_UART_Transmit(); 在阻塞模式中发送大量数据。串口轮询模式发送,使用超时管理机制 原型: HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); 1 huart:指向UART_HandleTypeDef结构的指针,该结构包含指定UART模块的配置信息。 pData:指向数据缓冲区(u8或u16数据元素)的指针。 Size:要发送的数据元素的数量(u8或u16) Timeout:超时时间 ***当UART奇偶校验不被启用时(PCE = 0),并且字长被配置为9位(M1-M0 = 01),他发送的数据被处理为u16的集合。在这种情况下,Size必须表示通过pData提供的u16的数量。 (2)HAL_UART_Receive(); 在阻塞模式下接收大量数据。串口轮询模式接收,使用超时管理机制 原型: HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); 1 huart:指向UART_HandleTypeDef结构的指针,该结构包含指定UART模块的配置信息。 pData:指向数据缓冲区(u8或u16数据元素)的指针。 Size:将接收的数据元素(u8或u16)的大小。 Timeout:超时时间 (3)HAL_UART_Receive_IT(); 串口中断模式接收,非阻塞模式下接收大量数据。 原型: HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 1 huart:指向UART_HandleTypeDef结构的指针,该结构包含指定UART模块的配置信息。 pData:指向数据缓冲区(u8或u16数据元素)的指针。 Size:接收多少数据元素(u8或u16)调用一次回调。 当UART奇偶校验不启用时(PCE = 0),并且字长被配置为9位(M1-M0 = 01),接收到的数据被处理为u16的集合。在这种情况下,Size必须表示pData中可用的u16的数量。 4.简单的阻塞式发送,阻塞式接收 strcpy(txbuf, "你好这是一次串口发送测试rn"); HAL_UART_Transmit(&huart1, txbuf, strlen(txbuf), 1000); strcpy(txbuf, "你好这是一次串口接收测试rn输入 go 开始下面步骤rn"); HAL_UART_Transmit(&huart1, txbuf, strlen(txbuf), 1000); int n = 1; while (n) { HAL_UART_Receive(&huart1, rxbuf, 100, 3000); if (rxbuf[0] == 'g' && rxbuf[1] == 'o') { strcpy(txbuf, "接收go成功rn开启串口接收中断测试rn"); HAL_UART_Transmit(&huart1, txbuf, strlen(txbuf), 1000); HAL_UART_Receive_IT(&huart1, rxbuf, 5); n = 0; break; } else { strcpy(txbuf, "接收失败请重新发送rn"); HAL_UART_Transmit(&huart1, txbuf, strlen(txbuf), 1000); } } 中断式接收 这是串口1的中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (rxbuf[0] == 'u', rxbuf[1] == 'p') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0); } if (rxbuf[0] == 'd', rxbuf[1] == 'o', rxbuf[2] == 'w', rxbuf[3] == 'n') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1); } HAL_UART_Transmit(&huart1, rxbuf, 5, 100); HAL_UART_Receive_IT(&huart1, rxbuf, 5); } 说明一下,这个函数调用一次只可以使用一次回调。当回调运行之后必须重新运行此函数才可以再一次响应 HAL_UART_Receive_IT(&huart1, rxbuf, 5); |
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
4199 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
3261 浏览 1 评论
2791 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
2224 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
15127 浏览 2 评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
3161浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
1936浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
2105浏览 3评论
2018浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
2210浏览 3评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 04:40 , Processed in 0.537918 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
434