我今天写了一个程序,就是模拟串口发送数据,同时我也开启了单片机自身的串口接收,开始我用了IAR自带的延迟函数来延迟发送的周期 ,但是在单片机串口连续接收数据的时候,这个自身带的延时函数不准确,为 明白是什么原因,所以我有改成TimeB作为延时函数,程序代码如我黄色标记的那样,这时候模拟串口发送数据的周期延迟很准确,但是这个时候如果你连续给串口发送数据的话,出现了串口数据丢失的现象,我不明白是什么问题,我还在TimeB定时中断中开启了全局中断嵌套中断_EINT()但是还是存在串口数据丢失的现象,代码如下: 求解答
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
void Monobus_Tx(unsigned char SendValue)
{ unsigned char i;
unsigned char Sendbit[9];
P2IE &= ~DRX; //关闭单总线接受
P2DIR |= DTX; //发送标志位
P2OUT |= DTX; //高电平标志位
delay_ms(MONOBUS_TRX_TIME);
for(i = 0; i < 8; i++)
{ Sendbit[i] = SendValue & 0x80;
if(Sendbit[i] == 0x80)
{ P2OUT |= DTX; }
else if(Sendbit[i] == 0x00)
{ P2OUT &= ~DTX; }
SendValue <<= 1;
// Monobus_Tx_Timer_Flag=1;
// Turn_On_TA1();
// while(Monobus_Tx_Timer_Flag); //定时器延时
delay_ms(MONOBUS_TRX_TIME); }
Sendbit[8]=((Sendbit[0]^Sendbit[1]^Sendbit[2]^Sendbit[3]^ Sendbit[4]^Sendbit[5]^Sendbit[6]^Sendbit[7])); //校验位
if(Sendbit[8] == 0x80)
{ P2OUT |= DTX; }
else { P2OUT &= ~DTX; }
delay_ms(MONOBUS_TRX_TIME);
P2OUT &= ~DTX; //再次拉低DTX口,给双控供电
P2IE |= DRX; //打开中断单总线接受
}