发新帖本帖赏金 8.00元(功能说明)我要提问
返回列表
打印
[STM32F1]

STM32F103ZET6串口实验只能接受发送一次数据

[复制链接]
521|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
王小琪|  楼主 | 2020-10-20 21:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,我用的是STM32CUBEMX和STM32F103ZET6进行的串口开发,想要实现的效果是复位可以用串口调试助手接收到“hello world!”当发送“0xa1”,串口调试助手可以接收到"LED1 Open!“
当发送“0xa2”,串口调试助手可以接收到"LED1 Closed!“
但是有一个小问题,只能用串口调试助手发送一次,可以接收到返回值。后面再发送就接收不到返回的值了。
#define LED1_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)
#define LED1_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)
#define LED2_ON() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET)
#define LED2_OFF() HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET)

uint8_t Tx_str1[] = "hello world!\r\n";
uint8_t Tx_str2[] = "LED1 Open!\r\n";
uint8_t Tx_str3[] = "LED1 Closed!\r\n";
uint8_t Rx_dat = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        if(Rx_dat == 0xa1)
        {
            LED1_ON();                        
            LED2_ON();
                        
            HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),10000);
            LED2_OFF();
            HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
        }
        else if(Rx_dat == 0xa2)
        {
            LED1_OFF();                        
            LED2_ON();
               
            HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),10000);
            LED2_OFF();
            HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
        }
    }
}

//在mian()函数中添加以下代码:
LED2_ON();
HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000);    //向上位机发送“hello world!”
LED2_OFF();
HAL_UART_Receive_IT(&huart1,&Rx_dat,1);                      //启动串口1接收上位机1个字节




使用特权

评论回复
沙发
王小琪|  楼主 | 2020-10-20 21:08 | 只看该作者
问题也解决了,就是加下面两句在串口发送之后,这两句好像是清除中断的操作,目前还没理解,只能死记硬背,拿来套用。
            huart1.RxState = HAL_UART_STATE_READY;
             __HAL_UART_FLUSH_DRREGISTER(&huart1);

使用特权

评论回复

打赏榜单

月落无痕 打赏了 4.00 元 2020-10-22

将心明月 打赏了 4.00 元 2020-10-22

发新帖 本帖赏金 8.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

227

主题

578

帖子

6

粉丝