完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/* 接收数据帧函数,实际上接收的是主机的指令 */
bit Recv_Data(uchar *type) { uchar tmp,rCount,i; uchar r_buf[RECFRMMAXLEN]; // 保存接收到的帧 uchar Flag_RecvOver; // 一帧接收结束标志 uchar Flag_StartRec; // 一帧开始接收标志 uchar CheckSum; // 校验和 uchar DataLen; // 数据字节长度变量 /* 禁止发送,允许接收 */ DE = 0; RE = 0; /* 接收一帧数据 */ rCount = 0; Flag_StartRec = 0; Flag_RecvOver = 0; while (!Flag_RecvOver) { RI = 0; while (!RI); tmp = SBUF; RI=0; /* 判断是否收到字符'$',其数值为0x24 */ if ((!Flag_StartRec) && (tmp == 0x24)) { Flag_StartRec = 1; } if (Flag_StartRec) { r_buf[rCount] = tmp; rCount ++; /* 判断是否收到字符'*',其数值为0x2A,根据接收的指令设置相应标志位 */ if (tmp == 0x2A) Flag_RecvOver = 1; } if (rCount == RECFRMMAXLEN) // 帧超长错误,返回0 return 0; } /* 计算校验和字节 */ CheckSum = 0; DataLen = r_buf[3]; for (i=0;i++;i<3+DataLen) { CheckSum = CheckSum + r_buf[i+1]; } /* 判断帧是否错误 */ if (rCount<6) // 帧过短错误,返回0,最短的指令帧为6个字节 return 0; if (r_buf[1]!=DevNo) // 地址不符合,错误,返回0 return 0; if (r_buf[rCount-2]!=CheckSum) // 校验错误,返回0 return 0; *type = r_buf[2]; // 获取指令类型 return 1; // 成功,返回1 } |
|
|
|
这是书上的写法
|
|
|
|
//串口中断处理(接收)
serial () interrupt 4 { if (RI) { RI = 0; if(!inbufful) { *inlast= SBUF; //放入数据 inlast++; //最后放入的位置加一 inbufsign=1; if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部 if (inlast==getlast) inbufful=1; //接收缓冲区满置满标志 } } } 这是程序里422接收中断函数 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 02:40 , Processed in 0.555396 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号