对于一些大多数单片机,他有一个专门的标志位来给串口的发送或接受数据做判断。
比如c51中,TIx和RIx。
TIx标识数据缓冲区的数据是否发送完毕,TIx = 1,表示发送完毕,TIx= 0,表示还没发送结束。
所以一个很简单的发送程序:
for(i=0;i
{
while(!TI0);
TI0=0;
SBUF0 = s_data[i];
}
像上面程序这样来发送数据。
但是,上面程序有可能出现问题,有时你会发现单片机一直发送不了数据,或发送的数据有些问题。
断点调试下你就会发现,单片机不发送数据的原因就是一直停留在while(!TI0)语句中。还好只是这样,如果是复杂的应用,导致数据错位或其他的,要找到原因还真麻烦啊。
问题原因很简单,就是如果程序在这之前没通过串口发送过数据呢?
比如下面的初始化:
void UART0_Init()
{
unsigned char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = UART0_PAGE;
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
SSTA0 = 0x15;
SFRPAGE = TMR2_PAGE;
TMR2CN = 0x00;
TMR2CF = 0x08;
RCAP2L = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 ));
RCAP2H = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 )>>8);
TMR2L = RCAP2L;
TMR2H = RCAP2H;
TR2 = 1;
SFRPAGE = SFRPAGE_SAVE;
}
看起来都没问题,但是,TI呢?
TI默认0,没错,因为压根没发送数据,哪有发送完成。可巧好我们需要的条件是发送完成...
于是,很简单:
for(i=0;i
{
while(!TI0);
TI0=0;
SBUF0 = s_data[i];
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』