单片机串口通信C语言编程问题

if(RI)
{
RI = 0;
Rev_Data = SBUF;
SBUF = Rev_Data;
while(!TI);
TI = 0;
if(Rev_Data == "t")
{
Sector_erase(0x2000); //扇区擦除
P1 = 0x55;
delay(5);
flag = 1;
i = 0;
}
else if(flag)
{
Byte_program(0x2000 + i ,Rev_Data); //写EEPROM
delay(2);
i++;
}
上面这个程序片段实现:从串口调试助手发送字符“t”到单片机,然后单片机的8个LED灯(由P1控制)应该为0101 0101的显示,但是结果表明并没有如此的现象,请问为什么呢?同时,串口初始化函数正确无误,芯片为STC89C52RC,内置2KB的EEPROM,同时EEPROM的各个子函数也是正确的。求解!!!

你看看接收并回传给串口助手的数据是否正确
if(Rev_Data == "t")
{
Sector_erase(0x2000); //扇区擦除。。。。把这一句注释掉,再看看结果
P1 = 0x55;
delay(5);
flag = 1;
i = 0;
}追问

你好,刚才观察过了,注释掉以后,串口助手返回的数据也是“t”,但是P1口还是没反应,也就是说根本没有运行到这句语句。。。。好坑爹的。。。

追答

if(Rev_Data == "t")这里 t 是单引号

追问

嗯,我现在改过来了,已经能够实现P1口的LEd灯变化了,随便问一下,上位机因为同时有很多数据传送到下位机,这个下位机的处理过程是不是会遗漏掉很多的数据?我本来应该接收到32个十六进制的数据,但是现在只能接收到11个数据,其他的应该是被错过了,有什么方法可以避免呢?

追答

你设一个数据缓冲区,比如定义一个数组Rev_Dat[32],在中断中做的事就是把数据保存到数组就行,然后在主函数中处理数据

追问

嗯。。谢谢了。。。非常感谢你的帮助。。。同时也非常感谢下面那一位热心网友,剩下的问题我就自己慢慢思索了。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-25
首先你应该先确认STC(死得惨)的串口波特率是否与电脑的波特率一致,
RS-232连接是否正确。
另外一个字符应该是‘t’,而不是“t”吧?追问

嗯。。。哥子,谢了,我把“t”换为‘t’之后就 成功了。。。随便 问一下,我这个上位机需要在短时间发送很多的十六进制数据到下位机,但是我上面这个程序运行也需要时间,所以有可能存在接收不到所有的数据的问题,我想请问一下,有没有什么方法可以让所有的数据都能接收到?

追答

采用中断方式就可以实现了,在接收中断中把接收到的数据拷贝到buf中,马上干其它活是可以的.

相似回答