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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版