求助:51单片机 和 315MHz 无线发送和接收的问题。
时间:10-02
整理:3721RD
点击:
之前在网上看到一个例程,但是有一段始终没搞懂,发上来,请教一下。
疑问:这个程序,在执行send()时,第一次判断(!send_busy)后,可以进入
if(head_counts)....但是执行到SEND_PULS(PULS_HEAD_WIDTH)后,
send_busy就为非0 了,那么下次就直接执行最后的
else{SEND_PULS(PULS_STOP_WIDTH)...}了,
好像不能进入发送send_buf[]的部分。
//=============================================================
//发送程序 开始
//=============================================================
#define PULS_0_WIDTH 8 //低电平脉宽
#define PULS_1_WIDTH 16 //高电平脉宽
#define PULS_HEAD_WIDTH 8 //前导信号脉宽
#define PULS_START_WIDTH 24 //引导信号脉宽
#define PULS_STOP_WIDTH 8 //结束码脉宽
#define PULS_HEAD_COUNTS 16 //前导信号长度
unsigned char send_buf[16];
#define send_byts send_buf[0] //剩余字节数,发送完后为0
unsigned char sending_byte; //当前正在发送的字节
unsigned char send_byte_p; //已发送字节数(含正在发送的字节)
unsigned char send_bit_p; //当前正在发送的字节已发送位数(含正在发送的位)
#define SEND_PROGRESSING 0x41
#define SEND_FAILED 0x21
#define SEND_SUCCESS 0x31
unsigned char send_stat = 0; //发送程序当前状态,为0时正常
unsigned char head_counts; //前导信号计数器(包括引导信号)
void start_send()
{
send_byte_p = 0;
send_bit_p = 0;
send_stat = SEND_PROGRESSING;
head_counts = 16;
}
#define START_SEND(byts) send_buf[0]=byts;send_byts=byts;start_send()
//发送前应清除send_byte_p,send_bit_p,send_stat,并设置send_byts
//发送过程中可根据send_byts的值得到剩余字节数,根据send_byte_p的值得到已发送字节数.注意,将正在发送的字节当作已发送完毕.
//发送过程中可根据send_stat的值得到发送状态.
//发送完成后,send_byts和send_bit_p的值都为0.
#define SEND_PULS(x) w_data=send_busy=(x>>1)
void send()
{
//下面两行在wirless()中已经执行过了,所以无需写上
// if (send_stat != SEND_PROGRESSING)
// return;
if (!send_busy)
{
if(send_byts || send_bit_p)
{
if (head_counts)
{
head_counts--;
if(head_counts)
SEND_PULS(PULS_HEAD_WIDTH);
else
SEND_PULS(PULS_START_WIDTH);
}
else{
if (send_bit_p == 0)
{
sending_byte = send_buf[send_byte_p];
send_byte_p++;
send_byts--;
send_bit_p = 8;
}
if(sending_byte & 0x80)
{
SEND_PULS(PULS_1_WIDTH);
}
else
{
SEND_PULS(PULS_0_WIDTH);
}
sending_byte <<= 1;
send_bit_p--;
}
}
else
{
SEND_PULS(PULS_STOP_WIDTH);
send_stat = SEND_SUCCESS;
}
}
return;
}
void clock_timer(void) interrupt 1 using 1
{
if (send_busy)
{
if(w_data)
{
w_data--;
w_stat = 0;
}
else
{
send_busy--;
w_stat = 1;
}
W_OUT = w_stat;
}
else
{
w_stat = W_IN;
if (w_stat != last_w_stat)
{
last_w_stat = w_stat;
if (w_stat)
{
w_data = recv_timer;
recv_timer = 0;
}
}
if (~recv_timer)//if(recv_busy != 0xff)
recv_timer++;
}
jiffies++;
T0_last=TL0;
}
疑问:这个程序,在执行send()时,第一次判断(!send_busy)后,可以进入
if(head_counts)....但是执行到SEND_PULS(PULS_HEAD_WIDTH)后,
send_busy就为非0 了,那么下次就直接执行最后的
else{SEND_PULS(PULS_STOP_WIDTH)...}了,
好像不能进入发送send_buf[]的部分。
//=============================================================
//发送程序 开始
//=============================================================
#define PULS_0_WIDTH 8 //低电平脉宽
#define PULS_1_WIDTH 16 //高电平脉宽
#define PULS_HEAD_WIDTH 8 //前导信号脉宽
#define PULS_START_WIDTH 24 //引导信号脉宽
#define PULS_STOP_WIDTH 8 //结束码脉宽
#define PULS_HEAD_COUNTS 16 //前导信号长度
unsigned char send_buf[16];
#define send_byts send_buf[0] //剩余字节数,发送完后为0
unsigned char sending_byte; //当前正在发送的字节
unsigned char send_byte_p; //已发送字节数(含正在发送的字节)
unsigned char send_bit_p; //当前正在发送的字节已发送位数(含正在发送的位)
#define SEND_PROGRESSING 0x41
#define SEND_FAILED 0x21
#define SEND_SUCCESS 0x31
unsigned char send_stat = 0; //发送程序当前状态,为0时正常
unsigned char head_counts; //前导信号计数器(包括引导信号)
void start_send()
{
send_byte_p = 0;
send_bit_p = 0;
send_stat = SEND_PROGRESSING;
head_counts = 16;
}
#define START_SEND(byts) send_buf[0]=byts;send_byts=byts;start_send()
//发送前应清除send_byte_p,send_bit_p,send_stat,并设置send_byts
//发送过程中可根据send_byts的值得到剩余字节数,根据send_byte_p的值得到已发送字节数.注意,将正在发送的字节当作已发送完毕.
//发送过程中可根据send_stat的值得到发送状态.
//发送完成后,send_byts和send_bit_p的值都为0.
#define SEND_PULS(x) w_data=send_busy=(x>>1)
void send()
{
//下面两行在wirless()中已经执行过了,所以无需写上
// if (send_stat != SEND_PROGRESSING)
// return;
if (!send_busy)
{
if(send_byts || send_bit_p)
{
if (head_counts)
{
head_counts--;
if(head_counts)
SEND_PULS(PULS_HEAD_WIDTH);
else
SEND_PULS(PULS_START_WIDTH);
}
else{
if (send_bit_p == 0)
{
sending_byte = send_buf[send_byte_p];
send_byte_p++;
send_byts--;
send_bit_p = 8;
}
if(sending_byte & 0x80)
{
SEND_PULS(PULS_1_WIDTH);
}
else
{
SEND_PULS(PULS_0_WIDTH);
}
sending_byte <<= 1;
send_bit_p--;
}
}
else
{
SEND_PULS(PULS_STOP_WIDTH);
send_stat = SEND_SUCCESS;
}
}
return;
}
void clock_timer(void) interrupt 1 using 1
{
if (send_busy)
{
if(w_data)
{
w_data--;
w_stat = 0;
}
else
{
send_busy--;
w_stat = 1;
}
W_OUT = w_stat;
}
else
{
w_stat = W_IN;
if (w_stat != last_w_stat)
{
last_w_stat = w_stat;
if (w_stat)
{
w_data = recv_timer;
recv_timer = 0;
}
}
if (~recv_timer)//if(recv_busy != 0xff)
recv_timer++;
}
jiffies++;
T0_last=TL0;
}
