1616|0

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

在DSP工程内数组、strnpy函数、atoi函数的使用心得 [复制链接]

这个是在用DSP实现一个功能时遇到的问题,程序要求获取一个字符数组里面指定位置的数据。


  1. 关于数组的声明方法:


  数组的声明方式有以下几种


    char ch[4] = {'a','b','c',};//方式1  {}里面也可以不填写数据
    char ch2[]="multi";//方式2  这种声明方式在开发DSP工程时最稳定
    char *ch3 = "micro";//方式3  指针方式
    char *ch4[3] = {"i” “love","China"};//方式4
  当时我在DSP程序里面采用的是第一种方式来接受SCIA串口发过来的数据


  unsigned char rxaBuffer[17] = {""};
      但结果显示出来的数据是有问题的,在用CCS软件调看rxaBuffer数组所在内存地址内的数据发现,数据并不只是16位,而是多出了几位,并且该数组最后也没有'\0'位。疑惑之时就用eclipse按照这种方式定义数组,调试运行之后发现,这时候数组里是有'\0'位的。所以感觉数组在标准C下和工程下的使用是有些不同的,感觉原因就出在数组的结尾符'\0'上面。所以下一次调试时就采用了方式2的声明方法,然后在DSP里面多次调试,最后发现数据是正确的,而方式2这种声明数组的方式在DSP工程里是最稳定的。


  方式2的好处就在于,由于没有初始化数组的长度,所以编译器会根据{}里面的数据个数自动计算数组长度,并且关键的是编译器会自动给数组添加结尾符'\0'。这样一来,数组的长度是由编译器来定的,减少人为干预,也就减少了程序出错的概率。


  对于方式3和方式4,在DSP上测试了一下,rxaBuffer数组内的数据是正确的,但使用strncpy函数截取rxaBuffer数组内的指定位置数据时出现出现问题



    strncpy(rxaBuffer_SelectEPwm, rxaBuffer, 1);
    strncpy(rxaBuffer_Rotation, rxaBuffer + 2, 1);
    strncpy(rxaBuffer_EPwmFrequency, rxaBuffer + 4, 7);
    strncpy(rxaBuffer_Occpuy_A, rxaBuffer + 12, 2);
    strncpy(rxaBuffer_Occpuy_B, rxaBuffer + 15, 2);



  如上程序所示,前三个数组均能正确的截取到rxaBuffer数组内的数据,但rxaBuffer_Occpuy_A数组却我发获取数组内的数据,进入rxaBuffer_Occpuy_A数组内存地址查询,发现该数组内数据的确不是指定位置的数据。调试多次,也没解决这个问题。


  综上所述,如在工程项目里使用数组,小编推荐使用方式2的方法声明,这样既能保证数组里面有足够的长度空间存储数据,也能保证数组里面有结尾符'\0'。


  2. 关于strncpy函数的使用


  strncpy函数的作用就是获取目标数组内指定位置,指定长度的数据,并将这段数据拷贝到一个新的函数里。其用法为


  strncpy( dest, src, 10);//dest为待存数组,src为待截取数据的目标数组,10是截取src数组里的数据长度
  如若想要截取src数组里中间位置的数据,可采用这样的方式


  strncpy( dest, src + 5, 10);//src + 5 表示src数组里从第5个数据后开始复制数据
  同时要注意,使用strncpy函数时,目标数组src内必须有结尾符'\0',否则会出错。这也是上文为什么推荐使用方式二来初始化数组。


  3. 关于atoi函数的使用


  此函数使用方法比较简单,其用法为


   int_SelectEPwm = atoi(rxaBuffer_SelectEPwm);
  int_SelectEPwm是int型变量,rxaBuffer_SelectEPwm是char型数组


  主要保证rxaBuffer_SelectEPwm数组里没有其他字符即可。

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表