daisyduxy 发表于 2019-12-19 11:29:22

STM32 串口不能循环输出问题

各位大神,帮忙看看;
在main里面,串口循环输出,22,可以输从串口助手这边,只看到7个22就没有,需要断电再连续,然后发送7个或者8个22又没有,为什么不能重复发送呢?仿真发现停在LDR R0,=SystemInit,已经尝试去掉所以断点,也扩大了Stack_Size      EQU   0x00000800。
小白请大神帮忙,谢谢~

while(1)
      {
                USART_SendData(USART2,0x22);
                USART_ClearFlag(USART2,USART_FLAG_TXE);
                Delay_ms(100);
      }


图片里面的 USART_ClearFlag(USART1,USART_FLAG_TXE);还没有改成USART2,请忽略这个。

tgw860910 发表于 2019-12-19 11:39:00

发送函数调用之后,一般是要等待发送完成标记被置起才能发送下一个字节的,你现在这样是直接清除了标记,不妥

likang1202 发表于 2019-12-19 11:47:41

有没有字节没发送完成就被清了

daisyduxy 发表于 2019-12-19 11:59:15

tgw860910 发表于 2019-12-19 11:39
发送函数调用之后,一般是要等待发送完成标记被置起才能发送下一个字节的,你现在这样是直接清除了标记,不 ...

那需要怎么改?
我之前是用printf 打印输出,结果发现发送一会就没有数据发送了,所以我就尝试直接输出22,看看情况,这个是之前的代码:
while(1)
        {
                for(i=0;i<3;i++)
        {
                LED_ON;
                Delay_ms(5);
                ADval=Get_ADValue();
        //        printf("OD:%.3f \r\n",ADval*3.3/4096);       
                printf("OD:%.3f \r\n",ADval);
        }
//        ADval/=10;       
       
       
        for(i=0;i<3;i++)
        {
                LED_OFF;
                Delay_ms(5);
                ADval=Get_ADValue();
        //        printf("OD:%.3f \r\n",ADval*3.3/4096);       
                printf("OD:%.3f \r\n",ADval);
        }
//        ADval/=10;       
       
}       

int fputc(int ch, FILE *f)
{
                DEBUG_USARTx->SR;

                USART_SendData(DEBUG_USARTx, (uint8_t) ch);
               
                while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);               
       
                return (ch);
}

radio2radio 发表于 2019-12-19 12:33:09

用HAL库,没有这样的细节不大不小的问题。
我帮不了您,解决以后请告诉大家您怎么解决的。

daisyduxy 发表于 2019-12-19 14:55:37

我也有点晕了,其实就是需要从外部采集到电压信号,经过采集处理后,通过串口输出给上位机。现在是想用UART2去发送AD转换后的数据。只需要发送数据就可以了。下面是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;
                USART_SendData(DEBUG_USARTx, (uint8_t) ch);
                while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE)== RESET);               
                return (ch);
}

int main ( void )
{

int i=0;
float ADval=0;
        USART_Config ();                                                         
        SysTick_Init ();                                                      
       
        AdcInit();
               
        Set_Adc(ADC_Channel_6);
        LED_ON;
        Delay_ms(10);
        while(1)
        {
                for(i=0;i<3;i++)
        {
                LED_ON;
                Delay_ms(5);
                ADval=Get_ADValue();
        //        printf("OD:%.3f \r\n",ADval*3.3/4096);       
                printf("OD:%.3f \r\n",ADval);
        }
       
        for(i=0;i<3;i++)
        {
                LED_OFF;
                Delay_ms(5);
                ADval=Get_ADValue();
        //        printf("OD:%.3f \r\n",ADval*3.3/4096);       
                printf("OD:%.3f \r\n",ADval);
        }
       
}       

目前串口调试助手上可以正确显示,但是只有很短的一段时间,需要断电后,重新连接,再发送一部分。我希望是可以一直发送数据。也是刚接触这个编程不久,看了不少的帖子,还有例子,还是弄的不是很清楚。

tgw860910 发表于 2019-12-19 15:51:35

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TC)== RESET);   

你试试用这个判断标记吧,不行就没有办法了

daisyduxy 发表于 2019-12-19 16:32:43

tgw860910 发表于 2019-12-19 15:51
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TC)== RESET);   

你试试用这个判断标记吧,不行 ...

我试着改了一下,还是没有用。
我尝试吧波特率改了一下,接收数据多一些,都没有传完整就停了,感觉像是设定的时间到了一样,不知道该从哪里去找:L

daisyduxy 发表于 2019-12-20 11:01:50

谁可以帮忙看看么?顶起

mylovemcu 发表于 2019-12-20 11:47:18

daisyduxy 发表于 2019-12-20 11:01
谁可以帮忙看看么?顶起

        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
    USART_SendData(USART2,22);   

你应该这样写就对了
页: [1] 2
查看完整版本: STM32 串口不能循环输出问题