51单片机,串口实验,麻烦帮忙看看,为什么不能正常接受数据?先发送后才可以?

#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define INBUF_LEN 4 //数据长度
uchar inbuf1[INBUF_LEN];
sbit M_RE= P2^5; //接收器低电平有效
sbit M_DE= P2^6; //驱动器高电平有效
sbit KEY1 = P3^2; //按键S19
char string[]="the big bang theory";
char string1[]="FC 33 D4 A1 A2 01 47";
sbit S1=P2 ^0;
sbit S10=P2 ^1;
sbit S100=P2 ^2;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//初始化串口
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr 串口模式1,允许接收(选择串口的工作方式和某些控制功能)
TMOD = 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload 定时1,方式2,
PCON = 0x80 ; //SMOD=1 波特率提高一倍
TH1 = 0xFa ; //Baud:9600 fosc=11.0592MHz
// IE = 0x90 ; //Enable Serial Interrupt 允许串口中断
TR1 = 1 ; // timer 1 run // TI=1;
ES=1;
EA=1;
}
//1ms延时
void Delay_1ms(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}

//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0 );
TI= 0 ;
}

//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
uint k= 0 ;
do
{
send_char_com(*(str + k));
k++;
}
while (k<strlen);
}

//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
uint temp;
// uint *P=inbuf1;
RI = 0 ;

temp=SBUF;

// inbuf1[INBUF_LEN]=SBUF;

P0 = table[temp/100]; // 百位
S1 = 0; S10 = 0; S100 = 0;
Delay_1ms(10);

P0 = table[temp%100/10]; //十位
S1 = 1; S10 = 0; S100 = 0;
Delay_1ms(10);

P0 = table[temp%10]; //个位
S1 = 0; S10 = 1; S100 = 0;
Delay_1ms(10);
}
}

main()
{
init_serialcomm(); //初始化串口

while ( 1 )
{

M_RE=0; //使串口处于接收状态
if(KEY1 ==0)
{
Delay_1ms(20); //20ms软件防抖
if(KEY1 ==0)
{
M_RE=1;
M_DE=1; // 串口处于发送状态
// send_string_com(inbuf1,INBUF_LEN);
// send_string_com(string,20);
// send_char_com( 'A');
send_string_com(string1,20);
M_RE=0;
M_DE=0; //设置串口再次处于接收状态
while(!KEY1);
Delay_1ms(20);
while(!KEY1);
}

}
}
}

第1个回答  2013-12-10
这程序,把动态显示部分,放在了串口中断里面。

中断一次,显示三位。

退出中断时,只有最后一位(个位),是亮的。追问

是的,这个程序只能显示个位,但是把接受到的放在数组里就可以了。因为SBUF只能存储一个字节。但是把接受到的放在数组里就可以了。

追答

51单片机,串口实验,麻烦帮忙看看,为什么不能正常接受数据?
----
即使收到了数据,你也不能明白的显示出来。

那么,不能正常接收数据,你又是怎么知道的呢?

第2个回答  2013-12-10

提供一个仿真实例 供参考,试试

追问

用RS232连接电脑和单片机,不会有影响。但是单片机和电脑分别接两个射频模块,两者在进行通讯时,单片机只有先发送数据后才能接受电脑发过来的数据。

追答

两者通信 本身就要一个为主机 一个为从机,如果是 单片机先发送数据 后 才能接受接收数据,
应该是 单片机 上电初始化 没有设置成接收状态。

追问

这个是单片机的程序,可是程序表明了单片机初始化后是接收状态,然后如果要发送数据,在转成发送状态,结束后又变成接收状态。
这程序在两者有线连接是发送接收没有问题,就是无线时,单片机要先发送个数据才能接收,不知道这两者为什么会这样?

追答

你的无线发送模块没有初始化成接收状态。

第3个回答  2013-12-10
加一条 TL1 = 0xFa ;追问

这是对波特率进行设置,波特率是没有问题的。

第4个回答  2013-12-10
大家帮忙看下我的电脑配置追问

???

相似回答