完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛
|
鸿哥 你好 有个地方不太懂 请教一下 您这个串口通讯 void usart_service() 程序 void usart_service() //串口服务程序,在main函数里 { if(send_update==1) //说明目前串口正在接收数据,不要读缓冲区数据 { send_lock=1; //开自锁标志 ++send_cnt; //只要有数据接收,send_cnt每次都被串口中断清零 if(send_cnt>cnt_send) //延时一段时间,确认缓冲区没有继续接受数据 { send_cnt=0; send_update=0; } } else //说明当前没有继续接收数据了 { if(send_lock==1) //在数据已经接收完毕,并且还没有处理过数据的情况下 { send_lock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据 m_int=0; //中间变量清零,用来统计处理了多少个刚刚接收的数据 while(RCREG_read_total CLRWDT(); RCREG_buf_temp[m_int]=asy_recieve(); if(m_int>=4) //说明接收了5个数据以上(2个有效数据加3个数据尾) { { if(RCREG_buf_temp[m_int-4]==0x01&& RCREG_buf_temp[m_int-3]==0x02)//有效数据是否为01 02的判断 { eusart_send(0x00); //串口发送一个填充的无效字节0x00,避免第一个字节丢失而引起的问题 eusart_send(0xeb); //串口发送应答的数据 eusart_send(0x00); //串口发送应答的数据 eusart_send(0xaa); //串口发送应答的数据 voice_time_cnt= cnt_voice_time; //蜂鸣器响“滴”一声就停 } else { eusart_send(0x00); //串口发送一个填充的无效字节0x00,避免第一个字节丢失而引起的问题 eusart_send(0xeb); //串口发送应答的数据 eusart_send(0x00); //串口发送应答的数据 eusart_send(0x55); //串口发送应答的数据 } break; //跳出循环 } } m_int++; //中间变量加1, } Buf_clear(); //把缓冲区的下标清零,方便下一堆数据接收与处理 } } } 中间有几个if 形成的嵌套 我想问的是 if(RCREG_buf_temp[m_int-2]==0xeb&& RCREG_buf_temp[m_int-1]==0x00&& RCREG_buf_temp[m_int]==0x55) //数据尾”eb 00 55”判断 跟下面的 if(RCREG_buf_temp[m_int-4]==0x01&& RCREG_buf_temp[m_int-3]==0x02)//有效数据是否为01 02的判断 能不能合起来呢 直接写在一个if后面的括号内呢???我感觉这些 几个条件都得满足啊 好像没有上下级或者包含的关系 还有 如果数据尾eb 00 55这个条件没达到 比如少了一个 或者变成其它数据了 那会不会报错呢? 因为最后面的那个else else { eusart_send(0x00); //串口发送一个填充的无效字节0x00,避免第一个字节丢失而引起的问题 eusart_send(0xeb); //串口发送应答的数据 eusart_send(0x00); //串口发送应答的数据 eusart_send(0x55); //串口发送应答的数据 } 应该服务的是跟它最近的一个if,但是如果上面数据尾的if判断就已经不成立的话应该就不会再进入函数内部 那就没法再报错 发回 eb 00 55 了 ,不知道我说的意思鸿哥看懂没。希望鸿哥不吝赐教 十分感谢哦! |
|
|
|
|
|
|
|
|
第一次才看到 希望有所收获
|
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2014-6-8 09:05 编辑
我的理解是,如果数据尾都不对,那么就不应该报错,否则任何一个干扰来,都返回报错。串口编程很灵活,你可以参考我的可取之处,再加上你自己的习惯来编写。我的代码没有上机验证过。但是我会把新开的技术贴《从业将近十年!手把手教你单片机程序框架(连载)》 里面的代码全部上机验证过,我以后还会在新帖讲串口。 |
|
|
|
|
|
|
|
|
本帖最后由 gg157551 于 2014-1-10 21:24 编辑
鸿哥编程的思想 小弟佩服的无以复加呵呵!受益匪浅啊!拜服拜服! 鸿哥,又麻烦你了,你这个大数据的加法里面有句没看懂 ?求教! uchar AddData(const uchar *destData,const uchar *sourceData,uchar *resultData) { uchar addResult=11; //开始默认返回的运算结果是正常 uchar destCnt=0; uchar sourceCnt=0; uchar i; uchar carryData=0; //进位 uchar maxCnt=0; //最大位数 uchar resultTemp=0; //存放临时运算结果的中间变量 //为什么不在本函数内先把resultData数组清零?因为后面章节中的乘法运算中要用到此函数实现连加功能。 //因此如果纯粹实现加法运算时,在调用本函数之前,必须先在外面把和的数组清零,否则会计算出错。 destCnt=GetDataLength(destData); //获取被加数的有效位数 sourceCnt=GetDataLength(sourceData); //获取加数的有效位数 if(destCnt>=sourceCnt) //找出两个运算数据中最大的有效位数 { maxCnt=destCnt; } else { maxCnt=sourceCnt; } for(i=0;i resultTemp=destData+sourceData+carryData; //按位相加 resultData=resultTemp%10; //截取最低位存放进保存结果的数组 carryData=resultTemp/10; //存放进位 } resultData=carryData; if((maxCnt==ARRAY_MAX)&&(carryData==1)) //如果数组的有效位是最大值并且最后的进位是1,则计算溢出报错 { ClearAllData(resultData); //把运算结果数组全部清零 addResult=10; //报错 } return addResult; } 上面一段程序中 红色的 那句怎么理解 ?感觉有点横空出世的样子 前不着村 后不着店的!没看懂 真心求教!麻烦了鸿哥! |
|
|
|
|
|
|
|
|
把最后一个进位保存。你首先要弄清楚for循环的结束条件,如果不加这个语句,就会漏掉最后的一个进位。 |
|
|
|
|
|
|
|
|
谢谢鸿哥指点!其实后来我又往下面看了几个乘法除法后 看懂了这句代码!还是十分感谢鸿哥!这两天在细看鸿哥的程序!真的有点感觉已经触摸到了鸿哥的思想的一个小角了呵呵!尤其是 看了这几个加减乘除的大数据的算法,绝对鸿哥原创,而且鸿哥的把思想同步转换成程序这个能力真的是犹如 庖丁解牛 游刃有余!实在敬佩呵! |
|
|
|
|
|
|
|
|
本帖最后由 gg157551 于 2014-1-11 21:24 编辑
鸿哥 你好 !请教您一下! 您在最近的液晶程序中 有不少后面都标注 驱动程序的最底层部分 这句是什么意思?是人家提供的 还是你自己照着资料说明 写的?就比如下面这段程序是人家原厂的还是您自己写的? void SendBitToHT1621(unsigned char nbit,unsigned char n) 此函数里面的形参 char n 怎么理解 ???应该就是8吧?还是16?还是? //发送一个字节中的N位到HT1621里,驱动程序的最底层部分 void SendBitToHT1621(unsigned char nbit,unsigned char n) { unsigned char i; for(i=0;i ht162x_wr_dr=0; if(nbit>=0x80) //判断最高位 ht162x_data_dr=1; else ht162x_data_dr=0; _nop_(); _nop_(); _nop_(); ht162x_wr_dr=1; _nop_(); _nop_(); _nop_(); nbit<<=1; } } 还有 下面这个核心程序 void seg_display(unsigned char col, unsigned char pag) 里面的 SendBitToHT1621(pag,6); //发送Y轴数据 SendBitToHT1621(col,4); //发送X轴数据 括号里面的参数6、4 怎么理解? 麻烦了 鸿哥呵呵! pag<<=2; ht162x_cs_dr=0; //选通HT1621 _nop_(); _nop_(); SendBitToHT1621(0xA0,3); //发送写数据模式101 SendBitToHT1621(pag,6); //发送Y轴数据 SendBitToHT1621(col,4); //发送X轴数据 ht162x_cs_dr=1; _nop_(); _nop_(); } |
|
|
|
|
|
|
|
|
本帖最后由 jianhong_wu 于 2014-1-11 21:58 编辑
是我根据人家的芯片资料写的。我也不知道该怎么解释,如果你有实物电路板上机演练才能领略到它的含义。 |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2381 浏览 1 评论
4238 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2617 浏览 2 评论
3113 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4570 浏览 5 评论
有套STM32与西门子200程序需要代写,有兴趣的工程师与有联系!
2484浏览 1评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6796浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 06:40 , Processed in 1.057927 second(s), Total 86, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖