stm32 uart 同时接收和发送时存在丢失数据的现象

[复制链接]
15484|23
 楼主| haov000 发表于 2012-2-21 08:26 | 显示全部楼层 |阅读模式
如题,当stm32的串口存在同时接收和发送的时候,会偶然出现丢失一个字节的现象,现在接收和发送都是使用中断做的,通过接收数据的一个计数发现,丢失字节时确实没有进入接收中断,现象好像丢失了一次接收中断似的,不知道有没有遇到过这种情况的?
 楼主| haov000 发表于 2012-2-21 08:27 | 显示全部楼层

stm32 uart 同时接收和发送时存在丢失数据的现象

本帖最后由 haov000 于 2012-2-21 08:58 编辑

如题,当stm32的串口存在同时接收和发送的时候,会偶然出现丢失一个字节的现象,现在接收和发送都是使用中断做的,通过接收数据的一个计数发现,丢失字节时确实没有进入接收中断,现象好像丢失了一次接收中断似的,不知道有没有遇到过这种情况的?
以下是中断处理函数:
    /*判读是否是接收缓冲区非空中断*/
    if (UART_HAS_DATA_REC(uart_base))
    {
        data = UART_READ_DATA(uart_base);
        BufAddData(&(uart->RecvBuf), &data, 1);
    }
    /*发送缓冲区中断是使能的并且发送数据寄存器为空*/
    if (UART_IS_TXEI_ENABLE(uart_base) && (!(UART_HAS_NOT_DATA_SND(uart_base))))
    {
        buf     = (uart->UartTxBuf).TxBuf;
        offset  = (uart->UartTxBuf).TxOffset;
        len     = (uart->UartTxBuf).TxLen;
        /*向发送缓冲区中添加一个字节的数据*/
        UART_SEND_DATA(uart_base, (*(buf + offset)));
        offset++;
        if (offset < len)   /*offset 小于 len 说明数据还没有发送完成*/
        {
            (uart->UartTxBuf).TxOffset = offset;
        }
        else                /*数据发送完成*/
        {
            /*禁能发送缓冲区空中断*/
            UART_DISABLE_TXEI(uart_base);
            /*开始发送完成中断*/
            UART_ENABLE_TCEI(uart_base);
        }
    }
   
    /*产生的是发送完成中断*/
    if (UART_IS_TXCI_ENABLE(uart_base) && UART_HAS_ALL_SND(uart_base))
    {
        /*禁能发送完成中断*/
        UART_DISABLE_TCEI(uart_base);
        /*清除发送完成中断*/
        UART_CLR_DATA_TX_END(uart_base);
        OSALSemRelease(uart->SendFlag);
    }
    /*溢出(过载)中断*/
    if (IS_RX_OVERFLOW(uart_base))
    {
        UART_READ_DATA(uart_base);
    }
    else if (IS_NOISE_ERR(uart_base) || IS_FRAME_ERR(uart_base))
    {
        UART_READ_DATA(uart_base);
    }
return;
    return ;
lb342 发表于 2012-2-21 08:35 | 显示全部楼层
没有遇到过
lb342 发表于 2012-2-21 08:36 | 显示全部楼层
没有遇到过,真没有
sjnh 发表于 2012-2-21 08:36 | 显示全部楼层
这种现象没有碰见
这是最基本的全双工方式,ST不应该犯这种低级错误
怀疑你的中断处理程序有问题,例如:你发送中断处理时,正好有接收中断,你处理完发送中断,清中断标志时顺便把接收标志也清除了
lb342 发表于 2012-2-21 08:37 | 显示全部楼层
没有遇到过,真没有
lb342 发表于 2012-2-21 08:38 | 显示全部楼层
没有遇到过,真没有
lb342 发表于 2012-2-21 08:38 | 显示全部楼层
没有遇到过,真没有,
程序匠人 发表于 2012-2-21 08:46 | 显示全部楼层
没有遇到过,真没有,
lb342 发表于 2012-2-21 08:38


没有就没有,干吗说5遍?

呵呵,话说,俺也没有遇到过,真没有
 楼主| haov000 发表于 2012-2-21 08:52 | 显示全部楼层
这种现象没有碰见
这是最基本的全双工方式,ST不应该犯这种低级错误
怀疑你的中断处理程序有问题,例如:你发送中断处理时,正好有接收中断,你处理完发送中断,清中断标志时顺便把接收标志也清除了 ...
sjnh 发表于 2012-2-21 08:36

发送时只是往数据寄存器写数据,接收中断标志(RXNE)只有读数据寄存器才会清除啊
香水城 发表于 2012-2-21 10:46 | 显示全部楼层
以前看到过有人曾经怀疑过STM32的USART全双工的问题,我们还特意做了一个试验,同一个STM32的同一个USART端口自发自收,没有发现问题。

LZ的问题应该是你的软件问题。
 楼主| haov000 发表于 2012-2-21 11:23 | 显示全部楼层
以前看到过有人曾经怀疑过STM32的USART全双工的问题,我们还特意做了一个试验,同一个STM32的同一个USART端口自发自收,没有发现问题。

LZ的问题应该是你的软件问题。 ...
香水城 发表于 2012-2-21 10:46

自发自收,我的程序也做过,没有问题;接收到再回发出去,这样测试也没有问题;但就是当usart接收和发送同时存在时会出现这种丢失数据的现象,感觉就像是rxne标志在内部被清除了没有产生中断一样
香水城 发表于 2012-2-21 11:52 | 显示全部楼层
自发自收就不属于“usart接收和发送同时存在”吗?
 楼主| haov000 发表于 2012-2-21 13:48 | 显示全部楼层
13# 香水城
不好意思,我说的接收、发送同时存在是两个uart测试的时候,自发自收是接收发送同时存在,但可能内部延时固定(由于内部实现原理我也不清楚,所以我也描述不清楚,只是实验出来的现象是这样的),不知道你们可不可以实验一下用两个uart测试,一个uart同时存在接收、发送的情况
hsbjb 发表于 2012-2-21 16:20 | 显示全部楼层
应该是程序的问题
yybj 发表于 2012-2-21 16:28 | 显示全部楼层
真没有遇到过
zzg 发表于 2012-2-21 21:43 | 显示全部楼层
你程序是不是用了库,慢的吐血,我以前做多串口遇到过,改成直接操作寄存器,ok了
 楼主| haov000 发表于 2012-2-22 08:26 | 显示全部楼层
17# zzg
没有使用库,都是自己写的,直接操作寄存器,问题是这种丢失字节的现象并不是经常出现,有时候传输了大量的数据之后才偶尔丢失一个字节,这种问题真恼人啊
19840312 发表于 2012-2-22 09:08 | 显示全部楼层
曾经遇到过,换了个质量过硬的232芯片,OK了
fuersenlz163 发表于 2012-11-1 11:25 | 显示全部楼层
我也遇到这样情况,我是中断接收 非中断回传,回传的数据会出现乱码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

132

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部