完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前在网上看到一个例程,但是有一段始终没搞懂,发上来,请教一下。
疑问:这个程序,在执行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; } |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
串口发送中断中对发送I/O口定义为GPIO输出,出现发送数据不完整,缺少2个字节,求解答
1168 浏览 3 评论
728 浏览 0 评论
【xG24 Matter开发套件试用体验】10-Bluetooth示例1
836 浏览 0 评论
919 浏览 0 评论
【xG24 Matter开发套件试用体验】power specification电源规格参数配置
747 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
10860 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-26 03:56 , Processed in 0.520560 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191