📄 sk.c
字号:
err = ReceiveComData(idComm1,returnBuf,800); //接收数据 if( !err ) for(i=0;i<3;i++) if(returnBuf[i] != commandContent[i]) { err = 0x95; break; } #ifdef debug printf("ReceiveComData Return Value = %d\n",err); #endif close(idComm1); //关闭串口 usleep(100); return err;}//---------------------------------------------------------------------------//---------------------------------------------------------------------------//SmFunc.c // 以下为公用函数 void Copy_Mem(unsigned char *ss,unsigned char *bb,int len) { int i; for(i=0;i<len;i++) *bb++=*ss++; } /*******************************************************/ /* 比较mem1 &mem2 */ /* return: 0 = mem1 == mem2 */ /* 1 = mem1 != mem2 */ /*******************************************************/ int CompData(unsigned char *mem1,unsigned char *mem2,int L) { int i; for(i=0;i<L;i++) { if(*(mem1+i) != *(mem2+i)) return 1; } return 0; }//功能: BCD码转换为ASCLL数字字符void BCDtoChar(unsigned char *CharStr,unsigned char BCDcode){ *CharStr++ = (BCDcode >> 4) + 0x30; *CharStr = (BCDcode & 0x0f) + 0x30;}//---------------------------------------------------------------------------//功能: 将单个字符转换为两个可见的十六进制字符 newvoid HexToDoubleASCII(unsigned char *CharStr,unsigned char BCDcode[],int len){ unsigned char StandardHexAscii[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',0}; int i; for(i=0;i<len;i++) { *CharStr = BCDcode[i] >> 4; *CharStr = StandardHexAscii[*CharStr]; CharStr++; *CharStr = (BCDcode[i] & 0x0f); *CharStr = StandardHexAscii[*CharStr]; CharStr++; }}//---------------------------------------------------------------------------//功能: ASCLL数字字符转换为BCD码unsigned char CharToBCD(unsigned char *Str){ unsigned char bcd, cc; bcd = *Str++; bcd -= '0'; if( bcd > 9 ) return 0xff; bcd <<= 4; cc = *Str; cc -= '0'; if( cc > 9 ) return 0xff; bcd += cc; return bcd;}//---------------------------------------------------------------------------//功能: 计算长整型的位数unsigned char digit_num(unsigned long num){ unsigned char i,temp; temp = 0; // for(i=0;i<8;i++) for(i=0;i<12;i++) { num /= 10; temp++; if(num == 0) break; } return(temp);}//---------------------------------------------------------------------------//功能: 将长整型转为字符型//输入: cc 长整型// str 字符型//返回: int 转换的长度int LongToStr(long cc,unsigned char *str){ int i,j; if(cc<0) cc = -cc; j = digit_num(cc); /* 计算cc的位数 */ *(str+j)=0; str = str + j -1; for (i=0;i<j;i++) { *str-- = cc%10+0x30; cc=cc/10; } return j;}//---------------------------------------------------------------------------//功能: 将字符型转换为整型//输入: str 字符串//返回: int 数字unsigned long StrToInteger(unsigned char* str){ int i; unsigned long l=0,ret_temp=0; l=strlen(str); for(i=0;i<l;i++) { ret_temp=ret_temp*10+(str[i]%0x30); //if(i!=l-1||i!=0) //ret_temp=ret_temp*10; } return ret_temp;}//---------------------------------------------------------------------------//功能: 将字符型转换为长整型//输入: str 字符串//返回: int 数字unsigned long StrToLong(unsigned char* str){ int i; long l,ret_temp=0; l=strlen(str); for(i=0;i<l;i++) { ret_temp=ret_temp*10+(str[i]%0x30); //if(i!=l-1||i!=0) ret_temp=ret_temp*10; } return ret_temp;}//---------------------------------------------------------------------------//功能: 长整型转换为ASC字符型数字//参数: *s 字符数组// num 要转换的长整形// L 长度//返回: 无返回void UnsignedLongToAsc(unsigned char *s,unsigned long num,int L){int i; for(i=L-1;i>=0;i--) { *(s+i) = (unsigned char)(num % 10) +0x30; num /= 10; } *(s+L)=0;}//---------------------------------------------------------------------------//功能: 整型转换为ASC字符型数字//参数: *s 字符数组// num 要转换的长整形// L 长度//返回: 无返回void UnsignedIntToAsc(unsigned char *s,unsigned int num,unsigned char L){ unsigned char i; /*i = num >> 8; num = (num << 8) | i;*/ for(i=L;i>0;i--) { *(s+i-1) = (unsigned char)(num % 10) + 0x30; num /= 10; }}//---------------------------------------------------------------------------//功能: COPY字符串//输入: t[] 目标字符// s[] 源字符// L COPY长度// 例: ByteMove(offset,(unsigned char *)&OffsetValue,4); !!! 整型值到char型值的转换void stByteMove(unsigned char t[],unsigned char s[],int L){ int i; for(i=0;i<L;i++) t[i] = s[i];}//---------------------------------------------------------------------------void ByteMoveMask_char(unsigned char t[],unsigned char s[],int Len){ int i; for(i=0;i<Len;i++) { if(s[i]=='_') t[i]=' '; else t[i]=s[i]; }}//---------------------------------------------------------------------------//功能: 十六近制数(小模式)到计算机识别的整型的字节移动//输入: t[] 目标字符// s[] 源字符// L COPY长度// 例: a[] = {0x0,0x0,0x0,0x01}; int b;// ByteMoveHexToCount((unsigned char *)&b,a,4); !!! 整型值到char型值的转换void ByteMoveHexToCount(unsigned char t[],unsigned char s[],int L){ int i,cnt=L-1; for(i=0;i<L;i++) t[i] = s[cnt--];}//ByteMoveNumberToHex函数与ByteMoveHexToNumber函数执行相同的动作,//但是为了在应用中便于区分使用意图,所以就多声明了一次void ByteMoveCountToHex(unsigned char t[],unsigned char s[],int L){ ByteMoveHexToCount(t,s,L);}//--------------------------------------------------------------------------- const unsigned char BIGNUM[] = {"零壹贰叁肆伍陆柒捌玖整"}; const unsigned char BIGUNT[] = {"万圆仟佰拾 角分"};/*int Get10nPower(int n){int rev = 1; while(n--) rev *= 10; return rev;}*/long Get10nPower(int n){ long rev = 1; while(n--) rev *= 10; return rev;}//---------------------------------------------------------------------------void MenoyToBigMenoy(long Menoy,unsigned char *BigMenoy){ unsigned char len; long tmp; long shang; int WanFlag = 0,ZeroFlag = 0; unsigned char *ps,*pd; unsigned char *dest = BigMenoy; if(!Menoy) return; tmp = Menoy; len = 0; pd = (unsigned char *)&BIGUNT[12]; while(tmp) { len++;tmp /= 10; } if(len > 6) WanFlag = 1; ps = (unsigned char *)&BIGUNT[2*(2+6-(len%7))]; if(WanFlag) ps-=6; tmp = Menoy; while(len) { if(ps == pd) { dest -= 2; if(WanFlag == 1) { *dest++ = BIGUNT[0]; *dest++ = BIGUNT[1]; WanFlag = 0; ps =(unsigned char *)&BIGUNT[4]; } else { *dest++ = BIGUNT[2]; *dest++ = BIGUNT[3]; } if(ZeroFlag) { *dest++ = BIGNUM[0]; *dest++ = BIGNUM[1]; } } else ; len--; shang = tmp / Get10nPower(len); tmp = tmp % Get10nPower(len); if(shang == 0 && ZeroFlag == 1) { ps++;ps++; continue; } *dest++ = BIGNUM[2*shang]; *dest++ = BIGNUM[2*shang+1]; if(shang == 0) { ZeroFlag = 1; ps++;ps++; } else { ZeroFlag = 0; *dest++ = *ps++;*dest++ = *ps++;} } dest -= 2; if(*dest == BIGNUM[0]) { *dest++ = BIGNUM[20]; *dest++ = BIGNUM[21]; } else { dest++; dest++; } *dest = 0;}//---------------------------------------------------------------------------//功能: 数据检查和//输入: *s 被检查字符串// Len 被检查数据长度// flag 此函数执行状态 1->建立; 0->检查;//返回: 数据和unsigned char CheckSum(unsigned char *s,unsigned char Len,unsigned char flag){ unsigned char i; unsigned char sum=0; for(i=0;i<Len;i++) sum += *(s++); if(flag) *s = sum; return(sum);}//---------------------------------------------------------------------------//功能:增加金额字符串中的'.'字符 //2001.10.27增加void Add_Decimal(unsigned char *s,int *length){ unsigned char temp; int s_length; s_length=*length; if(s_length>2) {s[s_length]=s[s_length-1]; //最后两个子节右移一个字节 2001.9.29 s[s_length-1]=s[s_length-2]; s[s_length-2]='.'; *length = *length+1; } else {if(s_length==1) {temp=s[0]; s[0]='0'; s[1]='.'; s[2]='0'; s[3]=temp; } if(s_length==2) {s[2]=s[0]; s[3]=s[1]; //最后两个子节右移一个字节 2001.9.29 s[0]='0'; s[1]='.'; } if(s_length<1) {s[0]='0'; s[1]='.'; s[2]='0'; s[3]='0'; } *length=4; }}//---------------------------------------------------------------------------/*struct tm{int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;};*///功能: 得到当前系统时间并且转换为BCD码//参数: DATE:用于返回生成的6位BCD码(年月日)void SystemDateToBcd(unsigned char *DATE){ int length; unsigned char DT_buf[20]; unsigned char Data_Buf[7]; time_t timeDT; struct tm *DT; time(&timeDT); //Linux get now date DT=localtime(&timeDT); //将当前时间转入DT'tm结构'中 memset(DT_buf,0x0,20); memset(Data_Buf,0x0,7); length = LongToStr((1900+DT->tm_year),Data_Buf); DT_buf[0]=CharToBCD(Data_Buf); DT_buf[1]=CharToBCD(&Data_Buf[2]); //? memset(Data_Buf,0x0,7); length = LongToStr((1+DT->tm_mon),Data_Buf); if(length<2) { Data_Buf[1] = Data_Buf[0]; Data_Buf[0] = 0x30;} DT_buf[2]=CharToBCD(Data_Buf); //月 memset(Data_Buf,0x0,7); length = LongToStr(DT->tm_mday,Data_Buf); if(length<2) { Data_Buf[1] = Data_Buf[0]; Data_Buf[0] = 0x30;} DT_buf[3]=CharToBCD(Data_Buf); //日 memset(Data_Buf,0x0,7); length = LongToStr(DT->tm_hour,Data_Buf); if(length<2) { Data_Buf[1] = Data_Buf[0]; Data_Buf[0] = 0x30;} DT_buf[4]=CharToBCD(Data_Buf); //小时 memset(Data_Buf,0x0,7);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -