新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > 《C与指针》读书笔记四

《C与指针》读书笔记四

作者:时间:2016-08-08来源:网络收藏

  数组是语言重要的概念,指的是相同类型、地址连续的一组数。一般是由数组名誉下标组成。在MODBUS通讯过程中使用数组作为寄存器的实现方式再合适不过了。虽然在实际情况中因为每个变量的类型不尽相同,但是为了归一化处理问题,只有选择容量大的类型。比如一组实际参数中有char型数据又有int 数据,那就全部使用int类型。虽然浪费了一些RAM空间,但是为通讯程序设计简化创造了条件,也为其他模块的设计奠定了基础。

本文引用地址:http://www.eepw.com.cn/article/201608/295183.htm

  我们摘取同事的参见一个例子:

  #define SYS_RUN_PARA_ADD_BASE 0x1000

  enum runParaAdd {

  runStateAdd, //运行状态

  runStageAdd, //运行阶段

  heatTempAdd, //加热温度

  HTBackTempAdd, //备份温度

  PT_4_20maAdd, //4-20mA

  DIPAdd, //跳线及远程班输入

  OPTAdd, //光耦

  relayAdd, //继电器数据

  runModeAdd, //运行加热模式,打开或者关闭

  startTallAdd, //启动塔

  errAdd, //错误寄存器

  YomAdd,

  };

  extern int runPara[YCComAdd+1];

  分析以上代码:int runPara[YCComAdd+1]; 定义了个数组,并且使用枚举量YCComAdd加1定义了数组的空间。YCComAdd到底是多少,参见枚举量runParaAdd定义,YCComAdd应该是常量11,11加1等于12。语句int runPara[YCComAdd+1]等价于runPara[12]。

  系统会在RAM区分配一个整型的数组,空间大小是12个整型。在VC6.0中应该是48个字节的空间。在设计通讯程序时直接根据地址可以访问该数组。

  RMESDATAHead *pMes;

  unsigned int regADD,crc; //寄存器地址

  unsigned int REGNumber; //数据数量

  unsigned char i;

  unsigned int j;

  pMes = UART0.RX_buf;

  if(pMes->CMD!=0x03) return;

  regADD = pMes->regADD;

  REGNumber = pMes->REGNumber;

  i=0;

  UART0.TX_buf[i++] = 0x01;

  UART0.TX_buf[i++] = 0x03;

  UART0.TX_buf[i++] = (unsigned char)(REGNumber*2);

  //读取运行参数

  if((regADD>=SYS_RUN_ADD_BASE)&&(regADD<=(SYS_RUN_ADD_BASE+SYS_RUN_STATE_ADD)))

  {

  regADD = regADD&0x00ff;

  for(j=0;j

  {

  UART0.TX_buf[i++]=SYS_RUN_PARA[regADD+j]>>8; UART0.TX_buf[i++]=SYS_RUN_PARA[regADD+j]& 0x00FF;

  }

  }

  //生成CRC校验

  crc = out_crc(UART0.TX_buf, i);

  UART0.TX_buf[i++]= crc>>8;

  UART0.TX_buf[i++]= crc & 0x00FF;

  SSendTxBufUart0( i );

  这两条语句就是 UART0.TX_buf[i++]=SYS_RUN_PARA[regADD+j]>>8; UART0.TX_buf[i++]=SYS_RUN_PARA[regADD+j]& 0x00FF;

  使用数组完成通讯程序。只要基本数据设计合理,MODBUS通讯程序非常简单。虽然在定义变量时浪费一些RAM,但在编写程序时可以省却大量的代码。

  一维数组使用最常见,地址是线性的,非常简单。很容易画出内存模型。

  比如:int arrary[10];

  因为我们并没有初始化arrary数组,所以值是随机的。



关键词: C 指针

评论


相关推荐

技术专区

关闭