对于一些大多数单片机,他有一个专门的标志位来给串口的发送或接受数据做判断。
比如c51中,TIx和RIx。
TIx标识数据缓冲区的数据是否发送完毕,TIx = 1,表示发送完毕,TIx= 0,表示还没发送结束。
所以一个很简单的发送程序:
for(i=0;i<len;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