打印

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

[复制链接]
13903|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 | 只看该作者
没有遇到过,真没有

使用特权

评论回复
5
sjnh| | 2012-2-21 08:36 | 只看该作者
这种现象没有碰见
这是最基本的全双工方式,ST不应该犯这种低级错误
怀疑你的中断处理程序有问题,例如:你发送中断处理时,正好有接收中断,你处理完发送中断,清中断标志时顺便把接收标志也清除了

使用特权

评论回复
6
lb342| | 2012-2-21 08:37 | 只看该作者
没有遇到过,真没有

使用特权

评论回复
7
lb342| | 2012-2-21 08:38 | 只看该作者
没有遇到过,真没有

使用特权

评论回复
8
lb342| | 2012-2-21 08:38 | 只看该作者
没有遇到过,真没有,

使用特权

评论回复
9
程序匠人| | 2012-2-21 08:46 | 只看该作者
没有遇到过,真没有,
lb342 发表于 2012-2-21 08:38


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

呵呵,话说,俺也没有遇到过,真没有

使用特权

评论回复
10
haov000|  楼主 | 2012-2-21 08:52 | 只看该作者
这种现象没有碰见
这是最基本的全双工方式,ST不应该犯这种低级错误
怀疑你的中断处理程序有问题,例如:你发送中断处理时,正好有接收中断,你处理完发送中断,清中断标志时顺便把接收标志也清除了 ...
sjnh 发表于 2012-2-21 08:36

发送时只是往数据寄存器写数据,接收中断标志(RXNE)只有读数据寄存器才会清除啊

使用特权

评论回复
11
香水城| | 2012-2-21 10:46 | 只看该作者
以前看到过有人曾经怀疑过STM32的USART全双工的问题,我们还特意做了一个试验,同一个STM32的同一个USART端口自发自收,没有发现问题。

LZ的问题应该是你的软件问题。

使用特权

评论回复
12
haov000|  楼主 | 2012-2-21 11:23 | 只看该作者
以前看到过有人曾经怀疑过STM32的USART全双工的问题,我们还特意做了一个试验,同一个STM32的同一个USART端口自发自收,没有发现问题。

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

自发自收,我的程序也做过,没有问题;接收到再回发出去,这样测试也没有问题;但就是当usart接收和发送同时存在时会出现这种丢失数据的现象,感觉就像是rxne标志在内部被清除了没有产生中断一样

使用特权

评论回复
13
香水城| | 2012-2-21 11:52 | 只看该作者
自发自收就不属于“usart接收和发送同时存在”吗?

使用特权

评论回复
14
haov000|  楼主 | 2012-2-21 13:48 | 只看该作者
13# 香水城
不好意思,我说的接收、发送同时存在是两个uart测试的时候,自发自收是接收发送同时存在,但可能内部延时固定(由于内部实现原理我也不清楚,所以我也描述不清楚,只是实验出来的现象是这样的),不知道你们可不可以实验一下用两个uart测试,一个uart同时存在接收、发送的情况

使用特权

评论回复
15
hsbjb| | 2012-2-21 16:20 | 只看该作者
应该是程序的问题

使用特权

评论回复
16
yybj| | 2012-2-21 16:28 | 只看该作者
真没有遇到过

使用特权

评论回复
17
zzg| | 2012-2-21 21:43 | 只看该作者
你程序是不是用了库,慢的吐血,我以前做多串口遇到过,改成直接操作寄存器,ok了

使用特权

评论回复
18
haov000|  楼主 | 2012-2-22 08:26 | 只看该作者
17# zzg
没有使用库,都是自己写的,直接操作寄存器,问题是这种丢失字节的现象并不是经常出现,有时候传输了大量的数据之后才偶尔丢失一个字节,这种问题真恼人啊

使用特权

评论回复
19
19840312| | 2012-2-22 09:08 | 只看该作者
曾经遇到过,换了个质量过硬的232芯片,OK了

使用特权

评论回复
20
fuersenlz163| | 2012-11-1 11:25 | 只看该作者
我也遇到这样情况,我是中断接收 非中断回传,回传的数据会出现乱码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

132

帖子

1

粉丝