免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1033 | 回复: 0
打印 上一主题 下一主题

串口/c程序/字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-25 15:11 |只看该作者 |倒序浏览

                               
       
       
       
       
       
       
串口工作需要,编写了一些小程序测试。以后慢慢添加我所编写的小程序。
字符串跟字符数组真是非常有意思的东东。老是搞混,经过这段时间的c编程才发现c真的是无所不能哇呵呵,同时也深深的感觉到了自己基础不够扎实。
字符数组的名称是个局部常量,不能作为子函数调用返回。因为离开了当前函数,它的作用就消失了,我编程时老想将这个字符数组返回,然后提示返回局部常量的错误,后来意识到这是个非常明显的错误,其实根本没有必要返回一个字符数组。
而字符串不同,指针变量一直存在于内存当中,直到程序销毁。
  char
  a='a';   //字符
  char
*b="abc";   //字符串
  字符串的初始化方式
char
b[4]="sds";
也可以
char b[4] =
{'s','d','s','\0'},如果后面加了一个\0符号,表示这是一个字符串。否则看成是字符数组。
  char
  c[15];         //字符数组,最多可以容纳15个字符,如果他要容纳一个字符串只能装14个有效字符和一个结束符
1
将16进制格式的字符串"30,00,01,41,11,11,11,11,11,11,11,11,1f,ae,3a"中的30,00,等16进制数提取出来并保存在check数组中,并且对数据部分进行crc校验。
#include

#include

[color="#800000"]//请求侦格式
30 00 01 41 11 11 11 11 11 11 11 11 1F
AE 3A
[color="#800000"]//数据侦格式
30 01 00 44 xx xx xx xx xx xx xx xx xx
xx 3A
[color="#800000"]//应答侦格式
30 01 00 42 11 11 11 11 11 11 11 11 1F
AE 3A
unsigned
int CRC16(unsigned char *data,int length);
int
main()
{
        unsigned
char *p;//对应侦的每一个字节
        char
a[74] = "30,00,01,41,11,11,11,11,11,11,11,11,1f,ae,3a";
        printf("the
length of a is %d\n",strlen(a));
        char
s[]=",";
        unsigned
char check[15];
        unsigned
char data[8];
        unsigned
int i,crcvalue,lResult;
        printf("the
string %s\n",a);
          
        p
= strtok(a,s);//按逗号截断
        lResult
= strtol(p,'\0',16);//再转换成16进制
        check[0]
= lResult;
        for(i=1;(i
        {
                lResult
= strtol(p,'\0',16);
                check
= lResult;
        }
        for(i=0;i
        {printf("check[%d]
is %x\n",i,check);}
       
        for(i=0;i
        {        data
= check[i+4];}
        crcvalue
= CRC16(data,8);
        printf("crcvalue
is %x\n",crcvalue);
}
unsigned
int CRC16(unsigned char *data,int length)
{
        unsigned
int crc;
        unsigned
int s;
        crc
= 0x00;
        while(length--)
        {
                crc
^=*data;
        for(s=0;s
        {       
                if(crc
& 0x01)
                        {crc=(crc>>1)^0x1021;}
                else        {crc=crc>>1;}
        }
        data++;
        }
return
crc;
[color="#800000"]}
2
将float或double定义的浮点数转换为16进制。浮点数在内存中以16进制的格式保存。假设float
x =11.2324;那么这个浮点数则存为8e432d9a的形式。
int
isLittleEndian()
{
  int
x = 1;
  if
(*(char *)&x == 1) {
   
printf("little-endian\n");
    return
TRUE;
  }
  else
{
   
printf("big-endian\n");
    return
FALSE;
  }
[color="#800000"]}
char
*float2HexStr(double f)
{
  unsigned
char *pf = (unsigned char *)&f;
//这条语句表示获得浮点数在内存中存储的首地址,如果是float类型,则从首地址开始连续4个字节表示这个浮点数的十六进制。如果是double类型,则从首地址开始连续的8个字节表示这个浮点数的十六进制。
        unsigned
char data[24];
        int
i;
  if
(sizeof(f)>sizeof(double))
  return
NULL;
  if
(isLittleEndian())
{
        for(i=0;i
        {printf("pf%d
is 0x%02x\n",i,pf);} 分别打印出这些十六进制的内容。
[color="#800000"]        sprintf(data,"%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x",pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6],pf[7]);//这里转换成字符串了       
        printf("data
is %s length is %d\n",data,strlen(data));
       
       
[color="#800000"]}
int
main() {
  double
f1 = 1009090.1178; 或者float
= 1009090.1178,则自己根据代码修改。

float2HexStr(f1);
        return
0;
[color="#800000"]}
字符串转16进制
       
       
       
       
       
       
3
将16进制的字符串转换成double类型的16进制值
#include

#include

int
main()
{
        char
*buff = "1748503c84cb2e41";
        int
i;
        //char
*p;//采用这种形式,输出结果不对。为什么????
        char
p[16];
        char
temp[8];
        for(i=0;i
        {
        sprintf(p,"%c%c",buff[2*i],buff[2*i+1]);
        temp
= strtol(p,'\0',16);
        }
        double
* pfValue=(double*)&temp[0]; //[color="#ff0000"]获得[color="#ff0000"]temp[color="#ff0000"]的首地址,强制转换为一个[color="#ff0000"]double[color="#ff0000"]类型
        printf("value
is %f\n",*pfValue);
[color="#800000"]}
4
将16进制的字符串转换成float类型的16进制值。有两种方法,一种也是同上的类型强制转换,另外就是采用union共同体
[color="#000000"]//方法1
int
main()
{
        int
i;
        //char
*p; 采用*p与p[16]的形式都可以
        char
p[16];
        char
*buff = "48e13641";
        char
temp[4];
        for(i=0;i
        {
        sprintf(p,"%c%c",buff[2*i],buff[2*i+1]);
        temp
= strtol(p,'\0',16);
        }
       
        float
* pfValue=(float*)&temp[0]; //获得temp的首地址,强制转换为一个double类型
        printf("value
is %f\n",*pfValue);
[color="#800000"]}
[color="#000000"]方法2
#include

#include

[color="#800000"]//方法1
以共同体union的
int
main()
{
        union
        {
                unsigned
char temp[4];
                float
value;
        }a;
        int
i;
        char
*buff = "48e13641";
        //unsigned
char *p;
        char
p[16];
        for(i=0;i
        {
        sprintf(p,"%c%c",buff[2*i],buff[2*i+1]);
        a.temp
= strtol(p,'\0',16);
        }
        printf("float
value is %f\n",a.value);
[color="#800000"]}
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93598/showart_2007076.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP