上一节我们使用协议占开发了一个ModbusTCP Server应用。接下来我们使用协议栈在开发一个基于串行链路的Mo***us RTU Slave应用。 根据前面对协议栈的封装,我们需要引用ModbusTCP Server的相关封装。在接收到命令后调用解析函数进行解析,解析函数的原型: ParsingMasterAccessCommand(uint8_t*receivedMesasage,uint8_t *respondBytes,uint16_t rxLength); RTU Slave使用串口中断接收信息,接收到信息后使用上述函数解析信息,根据接收的信息命令完成操作。 当然,除了调用解析函数外,我们要根据具体的需要实现8个回调函数,以完成真正的对Modbus对象的操作,这8个函数的原型如下: /*获取想要读取的Coil量的值*/ void GetCoilStatus(uint16_t startAddress,uint16_tquan tity,bool *statusList); /*获取想要读取的InputStatus量的值*/ void GetInputStatus(uint16_tstartAddress,uint16_t quantity,bool *statusValue); /*获取想要读取的保持寄存器的值*/ void GetHoldingRegister(uint16_tstartAddress,uint16_t quantity,uint16_t *registerValue); /*获取想要读取的输入寄存器的值*/ void GetInputRegister(uint16_tstartAddress,uint16_t quantity,uint16_t *registerValue); /*设置单个线圈的值*/ void SetSingleCoil(uint16_t coilAddress,boolcoilValue); /*设置单个寄存器的值*/ void SetSingleRegister(uint16_t registerAddress,uint16_tregisterValue); /*设置多个线圈的值*/ void SetMultipleCoil(uint16_tstartAddress,uint16_t quantity,bool *statusValue); /*设置多个寄存器的值*/ void SetMultipleRegister(uint16_tstartAddress,uint16_t quantity,uint16_t *registerValue); 这8个函数根据应用的具体需求来实现数据对象的操作,实现几个如何实现根据各自的应用需求和数据结构来确定。 当然,并非必须使用中断接收信息,也可以使用查询等方式,但是使用中断是一个比较好的方法,因为主站命令的发送一般并无规律,中断方式既可保证信息及时响应,也无须耗费太多的从站资源,而有更多资源去处理其他的任务。
|