本帖最后由 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 ;
|