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);   



改成这个,串口助手直接什么都不显示了:L

feifei2020 发表于 2019-12-20 16:59:02

改成这个
while( USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );
USART_SendData(USART2,22);

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);
}      
串口助手可以正常显示一部分后乱码,然后就没有数据传输,需要重新断电后,传输部分数据,乱码,...

feifei2020 发表于 2019-12-23 14:05:24

你好像没有进行GPIO_PinAFConfig配置,而且DEBUG_USART_GPIO_APBxClkCmd和DEBUG_USART_APBxClkCmd命令我没用过,不知道是什么。还有,你具体是哪个型号的STM32?

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

已经解决了,谢谢各位
页: 1 [2]
查看完整版本: STM32 串口不能循环输出问题