STC12C5A60S2串口1接收问题,问一下程序高手,为什么在1200波特率下这个串口接收不到。加个延迟程序就通

typedef struct _UART_BUF //串口缓存结构体变量UART_BUF
{
unsigned char buf [BUFLEN+1]; // 多申请一个字符保证最后一个字符永远是'0'
unsigned int index ;
}UART_BUF;
void init_uart1() //初始化UART1,110592,1200
{
SCON = 0x50 ;
TMOD = 0x20 ;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1 ;
ES = 1 ;
EA = 1 ;
clear_buf_uart1();
}

发送子程序我就不列出来了,发送是没问题的;

void Uart1() interrupt 4 using 1 //串口1接收数据
{
if(RI==1) //接收中断RI
{
RI = 0 ;
if(buf_uart1.index <= BUFLEN) //
{
buf_uart1.index++;
buf_uart1.buf[buf_uart1.index] = SBUF;
}
else
{
buf_uart1.index = 0;
}
}
}
以下是一个状态机的两个程序,主体我就不写了。大概就是串口1发送ATE0,然后接收到OK再执行下一条语句。
static void S_INIT0()
{
PUT("S_INIT0 \r\n");
clear_buf_uart1();
send_string_uart1(ATE0_CMD); //ATE0\x00D\x00A
current_status = RST ;
}
static void S_RST()
{
delayGSM_nms(500); //就是这里,不加的话这里就收到错误了,加了延迟后能正常收到OK!求高手帮忙看看。已经困恼好几天了,各种调试都试过了。是不是1200波特率太慢了?而且O和K的位置都后移了一位。正常的话O应该在buf_uart1.buf[2],K在buf_uart1.buf[3]!求高手解释一下!
if(buf_uart1.buf[3] == 'O' &&
buf_uart1.buf[4] == 'K')
{
clear_buf_uart1();
current_status = CREG ;
send_string_uart1(CREG_CMD);
}
else
{
debug_put_word(buf_uart1.buf[3]);
debug_put_word(buf_uart1.buf[4]);
clear_buf_uart1();
current_status = RST ;
send_string_uart1(ATE0_CMD);
}
}
正常的情况是单片机发ATE0给设备,然后设备返回0D 0A 4F 4B 0D 0A;我判断buf_uart1.buf[2]收到4F和buf_uart1.buf[3]收到4B,然后执行下一条语句。当前的情况是buf_uart1.buf[3]收到4F,buf_uart1.buf[4]收到4B,在接收之前还得加一下延迟,不然就执行不下去了,串口用的查询法,应该根本无需延迟的。

第1个回答  2013-03-07
是接收端的问题,发送得太快的话有的调试助手会把数据积压一段时间然后才能显示出来,有的调试助手不会这样