⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tools.c

📁 一个串口通讯的c语言的例子
💻 C
字号:
// 一些转换函数
/*判断是否数字型ASCII码串    1===不是	0===是*/
uchar NotNAsc(uchar *sour,uchar len){
	uchar tmp,i;

	for(i=0;i<len;i++)	{
		tmp=*(sour+i);
		if((tmp>0x39)||(tmp<0x30))
			return 1;
	}
	return 0;
}

//求10的times次方,返回为计算结果
unsigned long timesof10(int times){
	int i;
	unsigned long  result=1;

	for(i=0;i<times;i++)
		result=result*10;
	return result;
}

/*判断是否BCD码串   1===不是	0===是*/
uchar NotBcd(uchar *sour,uchar len){
	uchar tmp,i;

	for(i=0;i<len;i++){
		tmp=*(sour+i);
		tmp=(tmp>>4)&0x0f;
		if((tmp<0)||(tmp>9))
			return 1;
		tmp=*(sour+i);
		tmp=tmp&0x0f;
		if((tmp<0)||(tmp>9))
			return 1;
	}
	return 0;
}

//将一BCD码型的串转为LONG型数值,
//参数如下:num_uchars ----BCD码型的串长		sour----指向字串
//规则:if (sour=99,99,99) then result=999999;
//返回:LONG型数值
unsigned long bcd_to_long(uchar num_uchars,uchar *sour){
	unsigned long result1 = 0;
	uchar tmp;
	uchar i;

	if(NotBcd(sour,num_uchars))
		return 0;
	for(i = num_uchars;i > 0;i--){ 
		tmp = *(sour+num_uchars-i);
		result1 += (tmp>>4)*timesof10(2*i-1);
		result1 += (tmp&0x0f)*timesof10(2*i-2);
	}
	return result1;
}

//转换结果---右对齐,左补零	num_uchars---BCD字节数
//例:if sour=9999;nums=4;then dest=0x00,0x00,0x99,0x99;
void  long_to_bcd(long sour,uchar num_uchars,uchar *dest){
	unsigned char a;
	memset(dest,0,num_uchars);
	dest += num_uchars-1;
	while(num_uchars-- > 0){
		a = (sour % 10);
		sour /= 10;
		*dest = ((sour % 10)<<4) + a;
		dest--;
		sour /= 10;
	}
}

/*将LONG型金额转为一带有'。'分隔的通常金额表示方式 其中:DEST的第一个字节为转后的字串长度;
  strlen(dest)>=13
  if sour=99;   then dest=0x04,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,'.',0x39,0x39;
  if sour=9999; then dest=0x05,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x39,0x39,'.',0x39,0x39;
*/
int amount_conv(unsigned long sour,uchar *dest){
	int i,times,j;
	uchar bcd_buf[5];

	memset(dest,0x20,13);
	memcpy(dest+9,"0.00",4);
	long_to_bcd(sour,5,bcd_buf);

	if(sour<=0){
		*dest=0x04;
		return 0;
	}
	times=10;
	for(i=0;i<10;i++)
		if(sour/timesof10(i)==0){
			times=i;
			break;
		}
	for(i=0;i<times;i++){
		j=i/2;
	  	if(i%2==0)
			*(dest+12-i-1)=(bcd_buf[4-j]&0x0f)+0x30;
		else
			*(dest+12-i-1)=((bcd_buf[4-j]&0xf0)>>4)+0x30;
	}
	dest[12]=dest[11];
	dest[11]=dest[10];
	dest[10]='.';
	if(sour<100)
		dest[9]=0x30;
	if(sour<10)
		dest[11]=0x30;
	if(times<3)
		times=3;
	dest[0]=times+1;
	return 0;
}

//将ASC转为LONG		例if nums=5,sour="99999",then result=99999;
unsigned long asc_to_long(uchar nums,uchar *sour){
	uchar i;
	unsigned long result1=0;

	if(NotNAsc(sour,nums))
		return 0;

	for(i=0;i<nums;i++)
		result1+=(*(sour+i)-0x30)*timesof10(nums-i-1);
	return result1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -