模拟串口代码-不一样的方法

/******************************************************************************
* Function:     SimulateUart2RxTxDrv
* 
* author:       gxt
*
* date:         2017.12.07
*
* Description:
*               模拟uart接口向rx线读取1个数据或向tx线发送1个数据
*               ,1个起始位+8位数据+停止位,无校验位
*               ,放定时器中断中执行,定时器的定时时间是波特率换算
*               成时间的1/4,例如9600波特率每1位的时间为1/9600S=
*               104.16us,那定时器的定时时间应该设置为26us,数据接
*               收是在数据持续时间3/4的位置
*
* Parameters:    
*               NONE
*
* Return:  
*               NONE
* History:
*         <author>  <ver>  <date>  <des>
******************************************************************************/
void SimulateUart1RxTxDrv(void)
{
    static uint8 sendcnt = 0;
    static uint8 sbitnum = 0;
    
    static uint8 rbitnum = 0;
    static uint8 revcnt = 0;    

    if(SIM_UART1_GetRx_Start_Flag())
    {
        revcnt++;
        
        /*跳过起始位,并在数据时间长度3/4的位置接收数据位*/
        if((!((revcnt - 7) % 4)) && (revcnt >= 7))
        {
            if(rbitnum < 8)
            {
                if(SIM_UART1_RxInput())
                {
                    gSimUart1RcvData |= (1 << rbitnum);
                }
                else
                {
                    gSimUart1RcvData &= (~(1 << rbitnum));
                }
            }
            else
            {
                revcnt = 0;
                rbitnum = 0;
                SIM_UART1_SetRx_Inr_Flag();
                SIM_UART1_ClsRx_Start_Flag();

                //数据接收完成
                //ScomReadData(gSimUart1RcvData);
            }
            rbitnum++;
        }

        if(rbitnum > 7 && SIM_UART1_RxInput())
        {
            revcnt = 0;
            rbitnum = 0;
            SIM_UART1_SetRx_Inr_Flag();
            SIM_UART1_ClsRx_Start_Flag();
        }
    }
    else
    {
        revcnt = 0;
        rbitnum = 0;
    }

    if(SIM_UART1_GetTx_Busy_Flag())
    {
        /*在数据时间长度1/4的位置发送数据*/
        if((sendcnt++ % 4))
        {
            return;
        }

        /*发送起始位*/
        if(0 == sbitnum)
        {
            SIM_UART1_TxOutput(0);
        }
        /*发送数据位*/
        else if(sbitnum > 0 && sbitnum < 9)
        {
            if(gSimUart1SendData & 0x01)
            {
                SIM_UART1_TxOutput(1);
            }
            else
            {
                SIM_UART1_TxOutput(0);  
            }
            gSimUart1SendData >>= 1;
        }

        /*发送停止位*/
        if(sbitnum >= 9)
        {        
            SIM_UART1_TxOutput(1);
            SIM_UART1_ClsTx_Busy_Flag();
            
            sbitnum = 0;
            sendcnt = 0;
            
        }

        sbitnum++;  
    }
    else
    {
        sbitnum = 0;
    }    
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值