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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版