《C与指针》读书笔记四
数组是C语言重要的概念,指的是相同类型、地址连续的一组数。一般是由数组名誉下标组成。在MODBUS通讯过程中使用数组作为寄存器的实现方式再合适不过了。虽然在实际情况中因为每个变量的类型不尽相同,但是为了归一化处理问题,只有选择容量大的类型。比如一组实际参数中有char型数据又有int 数据,那就全部使用int类型。虽然浪费了一些RAM空间,但是为通讯程序设计简化创造了条件,也为其他模块的设计奠定了基础。
本文引用地址:https://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, //错误寄存器
};
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数组,所以值是随机的。
评论