你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 串口不能循环输出问题

[复制链接]
daisyduxy 提问时间:2019-12-19 11:29 /
阅读主题, 点击返回1楼
收藏 评论17 发布时间:2019-12-19 11:29
17个回答
daisyduxy 回答时间:2019-12-20 13:20:35
mylovemcu 发表于 2019-12-20 11:47
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
    USART_SendData(USART2,22);   

改成这个,串口助手直接什么都不显示了
feifei2020 回答时间:2019-12-20 16:59:02
改成这个
while( USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
USART_SendData(USART2,22);

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

feifei2020 回答时间:2019-12-20 17:05:39
1、TXE在单缓冲器传输中使用。而TC位则推荐在多缓存通讯中使用。
2、while应该放在前面,等待串口上的数据发送完毕,再发下一帧数据
yzzhh18 回答时间:2019-12-21 10:24:12
楼上说的没错while应该放在前面,放后面,串口初始化之后第一个字节发送不出去
daisyduxy 回答时间:2019-12-21 10:34:43
feifei2020 发表于 2019-12-20 17:05
1、TXE在单缓冲器传输中使用。而TC位则推荐在多缓存通讯中使用。
2、while应该放在前面,等待串口上的数据 ...

改成这个
while( USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
USART_SendData(USART2,22);
串口没有显示了
我改成printf输出:
int main(void)
{        

  USART_Config();        
        while(1)
        {        
        printf( "22 \n");        
        printf( "33 \n");               
        }
}
其他相关配置:
UART相关的配置:

void USART_Config(void)
{      GPIO_InitTypeDef GPIO_InitStructure;        USART_InitTypeDef USART_InitStructure;
        DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
        DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
        
        USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No ;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(DEBUG_USARTx, &USART_InitStructure);
        
        NVIC_Configuration();
        USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);        
        USART_Cmd(DEBUG_USARTx, ENABLE);               
        USART_ClearFlag(USART1, USART_FLAG_TC);     
}

/// 重定向C库函数printf到USART2
int fputc(int ch, FILE *f)
{
                DEBUG_USARTx->SR;
              while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE)== RESET);   
                USART_SendData(DEBUG_USARTx, (uint8_t) ch);
                       
                return (ch);
}      
串口助手可以正常显示一部分后乱码,然后就没有数据传输,需要重新断电后,传输部分数据,乱码,...
  
串口6.png
feifei2020 回答时间:2019-12-23 14:05:24
你好像没有进行GPIO_PinAFConfig配置,而且DEBUG_USART_GPIO_APBxClkCmd和DEBUG_USART_APBxClkCmd命令我没用过,不知道是什么。还有,你具体是哪个型号的STM32?

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

daisyduxy 回答时间:2019-12-23 14:57:45
feifei2020 发表于 2019-12-23 14:05
你好像没有进行GPIO_PinAFConfig配置,而且DEBUG_USART_GPIO_APBxClkCmd和DEBUG_USART_APBxClkCmd命令我没 ...

用的是STM32F103,我试着把我写的程序下载到开发板上,是没有问题的,我怀疑我的板子上485这块是不是有问题,我用的是MAX3485。
搞不懂哪里出问题了。
daisyduxy 回答时间:2019-12-24 11:03:04
已经解决了,谢谢各位
12
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版