数组是C言语重要的概念,指的是相同类型、地址接连的一组数。一般是由数组声誉下标组成。在MODBUS通讯过程中运用数组作为寄存器的完结方法再适宜不过了。尽管在实践情况中由于每个变量的类型不尽相同,可是为了归一化处理问题,只需挑选容量大的类型。比方一组实践参数中有char型数据又有int 数据,那就悉数运用int类型。尽管糟蹋了一些RAM空间,可是为通讯程序规划简化发明了条件,也为其他模块的规划奠定了根底。
咱们摘取搭档的拜见一个比方:
#define SYS_RUN_PARA_ADD_BASE 0x1000
enum runParaAdd {
runStateAdd, //运转状况
runStageAdd, //运转阶段
heatTempAdd, //加热温度
HTBackTempAdd, //备份温度
PT_4_20maAdd, //4-20mA
DIPAdd, //跳线及长途班输入
OPTAdd, //光耦
relayAdd, //继电器数据
runModeAdd, //运转加热形式,翻开或许封闭
startTallAdd, //发动塔
errAdd, //过错寄存器
YCComAdd,
};
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数组,所以值是随机的。