在调试rs232串口通信时,单片机往PC机上发数据,串口调试助手可以接收,但是PC往单片机发数据,接收不到。

我是采用查询方式的,在程序里通过点亮LED,灯不亮,我用示波器观察串口上的接收引脚没有反应,是什么原因?

先解释一下现象:

(1)MAX232的12脚即R1OUT连接到了单片机的RX脚,因此使用探头碰MAX232的12引脚时导入了干扰信号,所以接收到了乱的数据。同时,也证明了单片机的接收电路和程序都没有问题。

(2)板子上的地接到示波器上的地,PC才能收到数据,说明单片机与PC没有共地。同时,也证明了单片机的发送电路、程序和PC的接收电路都没有问题。

原理:

(1)PC的串口即RS232有9个引脚,与单片机通信时用到三个引脚,依次是2脚RX、3脚TX、5脚信号GND。

(2)而单片机串口与此相反,2脚TX、3脚RX、5脚信号GND。

(3)只要把这三根线依次连接,2-2、3-3、5-5即可完成通信。

(4)同时,根据实际通信设备接口不同,串口线也分多种,如直连线、交叉线、公母头区别等。

故障排除流程:

(1)用万用表等测量MAX232的14脚T1OUT与开发板串行接口的2脚TX、MAX232的13脚R1IN与开发板串行接口的3脚RX、开发板串行接口的5脚与电源地是不是分别连接。如果连接没问题,则进行下一步。

(2)用万用表等测量串口线,PC端的2脚与单片机端的2脚、PC端的3脚与单片机端的3脚、PC端的5脚与单片机端的5脚是不是分别对应,如果对应连接没问题,则进行下一步。

(3)将PC上串行接口的2、3引脚短接。

(4)打开串口工具如“超级串口”等,下载地址http://www.powerserial.com/download/,打开串口,在输入框中随便输入几个字符,看是不是能在接收窗口中收到。

(5)如果收不到,则说明PC的串口问题(排除串口工具没有开错串口或短接没问题的情况下),换台电脑试下。能收到,则说明电脑端收发都没问题,进行下一步。

(6)将串口线插到电脑上,开发板端的插头不插而直接将2、3脚短接。再次用串口工具发送,看是否能接收到,如果能接收到,则证明串口线没问题,进行下一步。

(7)将串口线插到开发板得串行接口上,再使用串口工具收发。

(8)如果以上都不行,则自己做3根线,也可以使用杜邦线,将PC的TX与开发板的RX、PC的RX与开发板的TX、PC的信号地与开发板的地分别相连。再用串口工具收发测试。

通过以上步骤,则可以逐步排查到问题的具体原因。不过,根据问题及之后的描述,最大的可能性是串口线用的不对,导致PC串口与开发板串口的3根线没有分别对应上。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-21
单片机往PC上能发说明串口本身应该没有问题:如果是你自己做的板子最好查看一下单片机接收那一路是否有虚焊或有短路情况(直接使用现成的开发板无视)。
然后仔细查看下程序是否有问题,再在程序中下断点,就下在接收到数据的下一条代码。然后发数据,如果断住说明数据收到了,是后面处理点亮LED的代码的问题。如果没有那就是没接收到。
还没有就再使用示波器,示波器要设置成低电平触发模式,单片机的串口(TX,RX)平时都是高电平,起始位是低电平,后面就是你设置的数据位(7位或8位),还有停止和校验位根据你设置的情况。数据发送都是瞬间完成的,所以一定要使用触发模式,如果捕捉不到,说明PC端的发送有问题,可以换个串口调试工具,还不行换跟串口线,再不行换台电脑。一般到此问题肯定能解决了啊(除非中途有操作失误的情况)
另外,一般使用串口还是使用中断模式,可以节省系统资源,降低功耗!追问

void siopinit() // 串口0、1初始化,设置串口0、1通信协议
{ RCLK=0;
TCLK=0;
TMOD=0x20; PCON=0; SCON=0x50; TH1=0xf8; TL1=0xf8; CKCON=0x11; TR1=1; }
void main(void)
{ siopinit();
while(1)
{ while(RI==0);
RI=0;
P11=0; //点亮LED2
}
这个程序有问题吗?

追答

初始化部分你的配置我不是很清楚(涉及到的波特率你检查下是否正确,串口调试设置的是否一致),主体部分是循环检测接收标志位,接收成功则退出循环点亮LED,应该没有问题。
解决程序问题最好还是使用调试。可以查看寄存器的值,下断点,帮助你查出问题。

第2个回答  2011-07-21
如果用的是51单片机,除了确认电缆没问题外,
可以查一下又没有可能不小心把对应RXD的SFR给赋值0了,查这个不一定要看程序,可以拔掉单片机芯片看串口上接收引脚波形,不好拔的话,按住单片机复位开关不松手也许也可以。追问

好的,谢谢

第3个回答  2011-07-21
步骤一,串口调试可以对你的单片机发送吗?如果可以,那就是你PC程序问题,如果不可以,那就是你单片机问题,但是也可能是步骤二问题。
步骤二:发送数据不对,一般常见的,比如16进制发送?还是ACSII发送?
步骤三:学会使用“串口监视”的小工具,监视数据包是否遵循协议。
步骤四:看你PC程序吧。用串口监视工具可以发现,可能你的PC程序都没有包出来。追问

我是用串口调试助手向单片机发送数据,单片机接收不到,请说明白一点,只跟单片机上的程序有关呀

追答

首先我们分为三段来解析这个通讯(事实上,所有的串口通讯都如此)
单片机-串口-串口调试助手等软件。
你首先要确定,串口调试助手有没有把数据发送给串口,再则确定,发送给串口的数据,对不对?都排除之后,再开始检查单片机,做事顺序是这样的。
串口监视 的小工具,你网上down下吧。

追问

好的,多谢,我先试试

第4个回答  2011-07-21
1、单片机串口控制在SCON里有个REN寄存器设置正确吗?接收允许标志。
2、串口中断开了吗?即使是查询方式也要有RI状态可以查询才能接收。
3、单片机串口接收最好还是用中断方式,方便的多
void ISR_SERIAL(void) interrupt 4
{
uchar i;
if(RI) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
i = SBUF; //SUBF接受/发送缓冲器
}
SBUF= i; // Echo
while(!TI);
TI = 0;
}追问

void siopinit() // 串口0、1初始化,设置串口0、1通信协议
{ RCLK=0;
TCLK=0;
TMOD=0x20; PCON=0; SCON=0x50; TH1=0xf8; TL1=0xf8; CKCON=0x11; TR1=1; }
void main(void)
{ siopinit();
while(1)
{ while(RI==0);
RI=0;
P11=0; //点亮LED2
}

追答

试试
#include
#define uchar unsigned char

void initial() //串口初始化
{
TMOD=0x20; //定时器1方式2
PCON=0x00; //SMOD=0
TH1=0xf8;
TL1=0xf8; // 定时器1初值
TR1=1; // 启动定时器1
SCON=0x50; //串口工作方式1并允许接收控制位
}

void main()
{
uchar num;
initial();
while(1)
{
while(RI==0);
RI=0;
num=SBUF;
P11=0;
SBUF=num;
while(TI==0);
TI=0;
}
}

追问

用了楼上的程序,可能是我的硬件问题,我用探头碰一下MAX232的12引脚,单片机就会接收,一连串接收很多数据,但是接收的不是我发送的那个数,不碰又不接收了,而且从单片机往PC发数据时,必须要板子上的地接到示波器上的地,PC才能收到数据,不知道怎么回事,我老师说这种现象无法解释,不管怎样还是十分感谢。

追答

检查一下串口的第5脚接地正常吗?或者说单片机板子和PC的串口共地了吗?
根据你描述现象可能:
1、232的焊接不良,从232到单片机的RX脚连接不良
2、串口线制作不良,第5脚的共地没起作用

相似回答