第63节:大数据的减法运算
时间:11-22
来源:互联网
点击:
- 数组。
- *返回值:9代表小于,10代表相等,11代表大于。
- */
- uchar CmpData(const uchar *destData,const uchar *sourceData)
- {
- uchar cmpResult=10; //开始默认相等
- uchar destCnt=0;
- uchar sourceCnt=0;
- uchar i;
- destCnt=GetDataLength(destData,BCD8_MAX);
- sourceCnt=GetDataLength(sourceData,BCD8_MAX);
- if(destCnt>sourceCnt)//大于
- {
- cmpResult=11;
- }
- else if(destCnt
- {
- cmpResult=9;
- }
- else if((destCnt==0)&&(sourceCnt==0))//如果都是等于0则等于
- {
- cmpResult=10;
- }
- else//否则就要继续判断
- {
- for(i=0;i
- {
- if(destData[destCnt-1-i]>sourceData[destCnt-1-i]) //从最高位开始判断,如果最高位大于则大于
- {
- cmpResult=11;
- break;
- }
- else if(destData[destCnt-1-i]
- {
- cmpResult=9;
- break;
- }
- //否则继续判断下一位
- }
- }
- return cmpResult;
- }
- /* 注释七:
- *函数介绍:两个数相减
- *输入参数:
- *(1)*destData--被减数的数组。
- *(2)*sourceData--减数的数组。
- *(3)*resultData--差的数组。注意,调用本函数前,必须先把这个数组清零
- *返回值:10代表计算结果是负数或者超出范围出错,11代表正常。
- */
- uchar SubData(const uchar *destData,const uchar *sourceData,uchar *resultData)
- {
- uchar subResult=11; //开始默认正常
- uchar destCnt=0;
- uchar i;
- uchar carryData=0;//进位
- uchar maxCnt=0; //最大位数
- uchar resultTemp=0; //存放临时运算结果的中间变量
- //为什么不在本函数内先把resultData数组清零?因为后面章节中的除法运算中要用到此函数实现连减功能。
- //因此如果纯粹实现减法运算时,在调用本函数之前,必须先在外面把差的数组清零,否则会计算出错。
- if(CmpData(destData,sourceData)==9)//被减数小于减数,报错
- {
- subResult=10;
- return subResult;//返回判断结果,并且退出本程序,不往下执行本程序余下代码
- }
- destCnt=GetDataLength(destData,BCD8_MAX);//获取被减数的有效数据长度
- maxCnt=destCnt;
- for(i=0;i
- {
- resultTemp=sourceData[i]+carryData; //按位相加
- if(resultTemp>destData[i])
- {
- resultData[i]=destData[i]+10-sourceData[i]-carryData; //借位
- carryData=1;
- }
- else
- {
- resultData[i]=destData[i]-sourceData[i]-carryData; //不用借位
- carryData=0;
- }
- }
- return subResult;
- }
- void usart_service(void)//串口服务程序,在main函数里
- {
- unsigned char i=0;
- unsigned char k=0;
- unsigned char ucGetDataStep=0;
- if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
- {
- ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
- //下面的代码进入数据协议解析和数据处理的阶段
- uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
- while(uiRcMoveIndex
- {
- if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55)//数据头eb 00 55的判断
- {
- i=0;
- ucGetDataStep=0;
- ucDataBCD4_cnt_1=0;//第1个数组合BCD码数组的有效数据长度
- ucDataBCD4_cnt_2=0;//第2个数组合BCD码数组的有效数据长度
- ClearAllData(BCD4_MAX,ucDataBCD4_1);//清零第1个参与运算的数据
- ClearAllData(BCD4_MAX,ucDataBCD4_2);//清零第2个参与运算的数据
- //以下while循环是通过关键字0x0d 0x0a来截取第1个和第2个参与运算的数据。
- while(i<(BCD8_MAX+4))//这里+4是因为有2对0x0d 0x0a结尾特殊符号,一个共4个字节
- {
- if(ucGetDataStep==0)//步骤0,相当于我平时用的case 0,获取第1个数,在这里是指被加数
- {
- if(ucRcregBuf[uiRcMoveIndex+3+i]==0x0d&&ucRcregBuf[uiRcMoveIndex+4+i]==0x0a) //结束标志
- {
- for(k=0;k
- {
- ucDataBCD4_1[k]=ucRcregBuf[uiRcMoveIndex+3+i-1-k]; //注意,接收到的数组数据与实际存储的数组数据的下标方向是相反的
- }
- i=i+2; //跳过 0x0d 0x0a 这两个字节,进行下一轮的关键字提取
- ucGetDataStep=1;//切换到下一个关键字提取的步骤
- }
- else
- {
- i++;
- ucDataBCD4_cnt_1++;//统计第1个有效数据的长度
- }
- }
- else if(ucGetDataStep==1) //步骤1,相当于我平时用的
大数据减法运 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)