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

STM32 串口不能循环输出问题

[复制链接]
daisyduxy 提问时间:2019-12-19 11:29 /
悬赏5ST金币未解决
各位大神,帮忙看看;
在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,请忽略这个。

串口输出.png
收藏 评论17 发布时间:2019-12-19 11:29

举报

17个回答
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);
        }
       
}       

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

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

我试着改了一下,还是没有用。
我尝试吧波特率改了一下,接收数据多一些,都没有传完整就停了,感觉像是设定的时间到了一样,不知道该从哪里去找
串口2.png
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 收起 理由
STMCU + 2

查看全部评分

12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版