串口通信做成同步发送

2019-07-26 16:23发布

异步接收的模式这样可行吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
hnkf118
2019-07-28 16:25
/********************************************************************************************************
* 功 能 : UART 串口中断响应函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1>
********************************************************************************************************/
#if   UART_UNIT_EN > 0 && (UART_RXD_EN > 0 || UART_TXD_EN > 0)

void ISR_Uart (void) interrupt  UART_INT_VECTOR
{
    if (TI0) {                                    // 发送数据处理 如果发送缓存为空 则置发送标志为允许状态
        u8_t temp;

        TI0 = 0;                                  //

#if UART_TXD_EN > 0
        if (UartTxBufCnt > 0) {                   // 检查发送消息缓存区是否为空 不为空则继续发数据
            UartTxBufCnt--;                       // 缓存计数器减1

            temp = UartTxBuf[UartTxOutIx];        // 读走一个数据到发送寄存器

#if UART_CHECK_MODE > 0
            __disable_irq();                      // 禁止中断
            ACC        = temp;                    // 计算奇偶校验位
            TB80       = P;                       // 奇偶校验位
            SBUF0 = temp;
            __enable_irq();                       // 开启中断
#endif
            if (++UartTxOutIx >= UART_TXD_SIZE) { //
                UartTxOutIx = 0;                  //
            }
        } else {
            UartTxbCan      = FALSE;              // 发送标志为0表示 可以直接发送信息
        }
#endif
    }


    if (RI0) {                                    // 接收到的数据直接进缓存 由应用程度读缓存得到需要的数据
        u8_t temp = SBUF0;                        //

        RI0  = 0;                                 // 清除接收中断标志
#if UART_CHECK_MODE > 0                           // 奇偶校验
        __disable_irq();
        ACC = temp;
        if ( P != RB80) {

#if UART_RXD_EN > 0
        if (UartRxBufCnt < UART_RXD_SIZE) {       //
            UartRxBufCnt++;                       // 接收缓存计数器加1
            UartRxBuf[UartRxInIx] = temp;         // 接收到的数据进缓存
            if (++UartRxInIx >= UART_RXD_SIZE) {  //
                UartRxInIx = 0;                   //
            }
        }
#endif // UART_RXD_EN
        }
        __enable_irq();

#else // UART_CHECK_MODE

#if UART_RXD_EN > 0
        if (UartRxBufCnt < UART_RXD_SIZE) {       //
            UartRxBufCnt++;                       // 接收缓存计数器加1
            UartRxBuf[UartRxInIx] = temp;         // 接收到的数据进缓存
            if (++UartRxInIx >= UART_RXD_SIZE) {  //
                UartRxInIx = 0;                   //
            }
        }
#endif
        }
#endif // UART_CHECK_MODE
    }
}
#endif


/********************************************************************************************************
* 功 能 : UART 发送1BYTE数据
* 入 口 : 'Dat' 发送的数据
* 返 回 : 1> UART_TXD_OK    发送数据OK
*         2> UART_TXD_FALSE 发送失败   一般是发送缓存已满
* 说 明 : 1> SBUF发送寄存器为空时直接把要发送的数据放到发送寄存器
*         2> SBUF发送寄存器为忙时来不及发的数据进入到发送缓存
*         3> 发送缓存满时直接返回发送失败
********************************************************************************************************/
#if    UART_UNIT_EN > 0 && UART_TXD_EN > 0 && UART_TXD_CHAR_EN > 0

u8_t UartTxPutChar (u8_t Dat)
{
    UART_ENTER_CRITICAL();                        // 进入临界
    if (!UartTxbCan) {                            // 判断串口直接发送允许标志位 0为允许
        UartTxbCan = TRUE;                        // 设置为忙
#if UART_CHECK_MODE == 0
        SBUF0      = Dat;                         // 发送出数据
#else
        __disable_irq();                          // 禁止中断
        ACC        = Dat;                         // 计算奇偶校验位
        TB80       = P;                           // 奇偶校验位
        __enable_irq();                           // 开启中断
        SBUF0      = Dat;                         // 发送出数据
#endif
        UART_EXIT_CRITICAL();                     // 退出临界
        return (UART_TX_NO_ERR);                     // 返回代码为发送OK
    }

    if (UartTxBufCnt < UART_TXD_SIZE) {           // 判断发送缓存计数器是否为最大发送缓存
        UartTxInBuf(Dat);                         // 来不及发送的数据一直等到进入发送缓存
        UART_EXIT_CRITICAL();                     // 退出临界
        return (UART_TX_NO_ERR);                     // 返回代码为发送OK
    }
    UART_EXIT_CRITICAL();                         // 是退出临界 不处理

    return (UART_TXD_FALSE);                      // 发送缓存满 返回代码为发送失败
}
#endif

一周热门 更多>