/****************************************************************************** * 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; } }
模拟串口代码-不一样的方法
最新推荐文章于 2024-06-07 09:56:59 发布