电脑和单片机【串口通信】时遇到一个问题,求解惑
在用电脑上的串口调试助手向单片机发送数据时,单片机只能接收到调试助手发送的第一个数,再发送其他数时就接收不到了,只有将调试助手的串口开关重新关掉再打开发送数据时单片机才能收到。为什么会这样,我用了最简单的测试方法:就是让接收到的数直接表现在p0口的发光二极管上,通过观察二极管的亮灭来判断的。
请大家帮我看下。
程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SM0=0;
SM1=1;
REN=1;
PS=1;
ES=1;
TR1=1;
EA=1;
P0=0x00;
while(1)
{
;
}
}
void intr2() interrupt 4
{
RI=0;
P0=SBUF;
delay(500);
}
[解决办法]
1. 首先,单片机之所以要引入中断这种机制,目的就是能让程序在执行顺序流程中快速的处理突发事件,而在中断程序执行过程中,单片机是不能或较难处理新的突发事件的,因此就要求中断处理程序尽量短,短到基本不影响其他中断或再次中断的处理,因此中断里基本上是不允许用延时的。
2. 就你这个例子来说,如果串口收到第一个数据,你进中断了,然后延时,假如串口连续发送了多个字节的数据,会导致后面的数据无法正常触发中断,导致串口发生溢出等错误。
3. 你的串口中断中没有串口异常恢复的处理,某些单片机串口进入异常后,如果你不恢复,就收不到东西了。
4. 不知道你的P0口灯是怎么接的,每个口一个么,你从串口发的似乎是字符'3',实际是0x33,比如你再发个字符'0',实际是0x30,和这个是否有关系呢?
5. 再有就有可能是硬件问题了,比如你是否用了232电平转换芯片,电平转换芯片的供电是否正确,比如有的232是5V的,你的单片机供电是3V的,这样用可能会造成一些比较奇怪的问题出现。
6. 再有就是你可以换个方法试试,比如说把串口收到的数从串口再发出去,用另一种方法验证一下
7. 如果还找不到问题,你就上示波器吧