modbus: recreate static lib with correct hooks

This commit is contained in:
Vasily Davydov 2022-10-18 10:38:42 +03:00
parent 0cbf3c7038
commit b8dbe681fa
5 changed files with 507 additions and 441 deletions

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> <?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings"> <storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="com.crt.advproject.config.lib.debug.1243980727"> <cconfiguration id="com.crt.advproject.config.lib.debug.796503394">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.lib.debug.1243980727" moduleId="org.eclipse.cdt.core.settings" name="Debug"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.lib.debug.796503394" moduleId="org.eclipse.cdt.core.settings" name="Debug">
<externalSettings> <externalSettings>
<externalSetting> <externalSetting>
<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/Modbus"/> <entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/Modbus"/>
@ -21,50 +21,76 @@
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="a" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.lib.debug.1243980727" name="Debug" parent="com.crt.advproject.config.lib.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size &quot;lib${BuildArtifactFileName}&quot; ; # arm-none-eabi-objdump -h -S &quot;lib${BuildArtifactFileName}&quot; &gt;&quot;${BuildArtifactFileBaseName}.lss&quot;"> <configuration artifactExtension="a" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.lib.debug.796503394" name="Debug" parent="com.crt.advproject.config.lib.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size &quot;lib${BuildArtifactFileName}&quot; ; # arm-none-eabi-objdump -h -S &quot;lib${BuildArtifactFileName}&quot; &gt;&quot;${BuildArtifactFileBaseName}.lss&quot;">
<folderInfo id="com.crt.advproject.config.lib.debug.1243980727." name="/" resourcePath=""> <folderInfo id="com.crt.advproject.config.lib.debug.796503394." name="/" resourcePath="">
<toolChain id="com.crt.advproject.toolchain.lib.debug.1747277720" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.lib.debug"> <toolChain id="com.crt.advproject.toolchain.lib.debug.488159270" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.lib.debug">
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.lib.debug.1818998794" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.lib.debug"/> <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.lib.debug.2139523672" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.lib.debug"/>
<builder buildPath="${workspace_loc:/Modbus}/Debug" id="com.crt.advproject.builder.lib.debug.1542146393" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.lib.debug"/> <builder buildPath="${workspace_loc:/Modbus}/Debug" id="com.crt.advproject.builder.lib.debug.1579116261" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.lib.debug"/>
<tool id="com.crt.advproject.cpp.lib.debug.619745829" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.lib.debug"> <tool id="com.crt.advproject.cpp.lib.debug.209035710" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.lib.debug">
<option id="com.crt.advproject.cpp.hdrlib.1940415426" name="Library headers" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false"/> <option id="com.crt.advproject.cpp.thumb.259697205" name="Thumb mode" superClass="com.crt.advproject.cpp.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.crt.advproject.cpp.fpu.893968908" name="Floating point" superClass="com.crt.advproject.cpp.fpu" useByScannerDiscovery="true"/> <option id="com.crt.advproject.cpp.specs.514010321" name="Specs" superClass="com.crt.advproject.cpp.specs" useByScannerDiscovery="false" value="com.crt.advproject.cpp.specs.newlib" valueType="enumerated"/>
</tool> <option id="com.crt.advproject.cpp.arch.1146076479" name="Architecture" superClass="com.crt.advproject.cpp.arch" useByScannerDiscovery="true" value="com.crt.advproject.cpp.target.cm3" valueType="enumerated"/>
<tool id="com.crt.advproject.gcc.lib.debug.284142615" name="MCU C Compiler" superClass="com.crt.advproject.gcc.lib.debug"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.1225522102" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
<option id="com.crt.advproject.gcc.thumb.1769631408" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.crt.advproject.gcc.arch.1802329931" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1874114209" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="DEBUG"/> <listOptionValue builtIn="false" value="DEBUG"/>
<listOptionValue builtIn="false" value="__CODE_RED"/> <listOptionValue builtIn="false" value="__CODE_RED"/>
<listOptionValue builtIn="false" value="__REDLIB__"/> <listOptionValue builtIn="false" value="__NEWLIB__"/>
<listOptionValue builtIn="false" value="CORE_M3"/> <listOptionValue builtIn="false" value="CORE_M3"/>
<listOptionValue builtIn="false" value="__USE_LPCOPEN"/>
<listOptionValue builtIn="false" value="__LPC15XX__"/> <listOptionValue builtIn="false" value="__LPC15XX__"/>
</option> </option>
<option id="gnu.c.compiler.option.misc.other.1372819195" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> <option id="gnu.cpp.compiler.option.other.other.124292613" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions" valueType="string"/>
<option id="gnu.c.compiler.option.optimization.flags.933521341" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/> <option id="gnu.cpp.compiler.option.optimization.flags.1921314613" name="Other optimization flags" superClass="gnu.cpp.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
<option id="com.crt.advproject.gcc.hdrlib.727060650" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="Redlib" valueType="enumerated"/> <option id="com.crt.advproject.cpp.hdrlib.1590569765" name="Library headers" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false" value="Newlib" valueType="enumerated"/>
<option id="com.crt.advproject.gcc.fpu.1031944818" name="Floating point" superClass="com.crt.advproject.gcc.fpu" useByScannerDiscovery="true"/> <option id="com.crt.advproject.cpp.fpu.1729598885" name="Floating point" superClass="com.crt.advproject.cpp.fpu" useByScannerDiscovery="true"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.2142704447" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1740150318" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_board_nxp_lpcxpresso_1549/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_chip_15xx/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.c.misc.dialect.1244882132" superClass="com.crt.advproject.c.misc.dialect" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/> <option id="com.crt.advproject.cpp.misc.dialect.747855378" superClass="com.crt.advproject.cpp.misc.dialect" value="com.crt.advproject.misc.dialect.c++11" valueType="enumerated"/>
<inputType id="com.crt.advproject.compiler.input.1577047141" superClass="com.crt.advproject.compiler.input"/> <inputType id="com.crt.advproject.compiler.cpp.input.1385489560" superClass="com.crt.advproject.compiler.cpp.input"/>
</tool> </tool>
<tool id="com.crt.advproject.gas.lib.debug.1255319619" name="MCU Assembler" superClass="com.crt.advproject.gas.lib.debug"> <tool id="com.crt.advproject.gcc.lib.debug.1137532337" name="MCU C Compiler" superClass="com.crt.advproject.gcc.lib.debug">
<option id="com.crt.advproject.gas.thumb.2090111823" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> <option id="com.crt.advproject.gcc.thumb.1945489176" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.crt.advproject.gas.arch.286411657" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> <option id="com.crt.advproject.gcc.arch.216012255" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/>
<option id="gnu.both.asm.option.flags.crt.1889634062" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DDEBUG -D__CODE_RED -DCORE_M3 -D__LPC15XX__" valueType="string"/> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.562043933" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
<option id="com.crt.advproject.gas.hdrlib.1568322710" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="Redlib" valueType="enumerated"/> <listOptionValue builtIn="false" value="DEBUG"/>
<option id="com.crt.advproject.gas.fpu.457683638" name="Floating point" superClass="com.crt.advproject.gas.fpu"/> <listOptionValue builtIn="false" value="__CODE_RED"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.1321781434" superClass="gnu.both.asm.option.include.paths" valueType="includePath"> <listOptionValue builtIn="false" value="CORE_M3"/>
<listOptionValue builtIn="false" value="__USE_LPCOPEN"/>
<listOptionValue builtIn="false" value="__LPC15XX__"/>
<listOptionValue builtIn="false" value="__NEWLIB__"/>
</option>
<option id="gnu.c.compiler.option.misc.other.241461042" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/>
<option id="gnu.c.compiler.option.optimization.flags.2103709436" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.1053265155" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_board_nxp_lpcxpresso_1549/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_chip_15xx/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
</option> </option>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1466535826" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> <option id="com.crt.advproject.c.misc.dialect.879255695" superClass="com.crt.advproject.c.misc.dialect" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/>
<inputType id="com.crt.advproject.assembler.input.1240443838" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> <option id="com.crt.advproject.gcc.hdrlib.481939904" superClass="com.crt.advproject.gcc.hdrlib" value="Newlib" valueType="enumerated"/>
<option id="com.crt.advproject.gcc.specs.1921096932" superClass="com.crt.advproject.gcc.specs" value="com.crt.advproject.gcc.specs.newlib" valueType="enumerated"/>
<inputType id="com.crt.advproject.compiler.input.1261574351" superClass="com.crt.advproject.compiler.input"/>
</tool> </tool>
<tool id="com.crt.advproject.ar.lib.debug.279077506" name="MCU Archiver" superClass="com.crt.advproject.ar.lib.debug"/> <tool id="com.crt.advproject.gas.lib.debug.1508409768" name="MCU Assembler" superClass="com.crt.advproject.gas.lib.debug">
<option id="com.crt.advproject.gas.thumb.1166910110" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
<option id="com.crt.advproject.gas.arch.1242237185" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/>
<option id="gnu.both.asm.option.flags.crt.623048910" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -DDEBUG -D__CODE_RED -DCORE_M3 -D__USE_LPCOPEN -D__LPC15XX__ -D__NEWLIB__" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.1819424271" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_board_nxp_lpcxpresso_1549/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_chip_15xx/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
</option>
<option id="com.crt.advproject.gas.hdrlib.754991651" superClass="com.crt.advproject.gas.hdrlib" value="Newlib" valueType="enumerated"/>
<option id="com.crt.advproject.gas.specs.1411945783" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.792255883" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
<inputType id="com.crt.advproject.assembler.input.64420305" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
</tool>
<tool id="com.crt.advproject.ar.lib.debug.460749273" name="MCU Archiver" superClass="com.crt.advproject.ar.lib.debug"/>
</toolChain> </toolChain>
</folderInfo> </folderInfo>
<sourceEntries> <sourceEntries>
@ -75,8 +101,8 @@
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration> </cconfiguration>
<cconfiguration id="com.crt.advproject.config.lib.release.1542215730"> <cconfiguration id="com.crt.advproject.config.lib.release.1641992972">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.lib.release.1542215730" moduleId="org.eclipse.cdt.core.settings" name="Release"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.lib.release.1641992972" moduleId="org.eclipse.cdt.core.settings" name="Release">
<externalSettings> <externalSettings>
<externalSetting> <externalSetting>
<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/Modbus"/> <entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/Modbus"/>
@ -95,45 +121,75 @@
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="a" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.lib.release.1542215730" name="Release" parent="com.crt.advproject.config.lib.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size &quot;lib${BuildArtifactFileName}&quot; ; # arm-none-eabi-objdump -h -S &quot;lib${BuildArtifactFileName}&quot; &gt;&quot;${BuildArtifactFileBaseName}.lss&quot;"> <configuration artifactExtension="a" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.lib.release.1641992972" name="Release" parent="com.crt.advproject.config.lib.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size &quot;lib${BuildArtifactFileName}&quot; ; # arm-none-eabi-objdump -h -S &quot;lib${BuildArtifactFileName}&quot; &gt;&quot;${BuildArtifactFileBaseName}.lss&quot;">
<folderInfo id="com.crt.advproject.config.lib.release.1542215730." name="/" resourcePath=""> <folderInfo id="com.crt.advproject.config.lib.release.1641992972." name="/" resourcePath="">
<toolChain id="com.crt.advproject.toolchain.lib.release.517404726" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.lib.release"> <toolChain id="com.crt.advproject.toolchain.lib.release.661726016" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.lib.release">
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.lib.release.1949021336" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.lib.release"/> <targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.lib.release.1397461883" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.lib.release"/>
<builder buildPath="${workspace_loc:/Modbus}/Release" id="com.crt.advproject.builder.lib.release.4446171" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.lib.release"/> <builder buildPath="${workspace_loc:/Modbus}/Release" id="com.crt.advproject.builder.lib.release.2022185850" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.lib.release"/>
<tool id="com.crt.advproject.cpp.lib.release.20616150" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.lib.release"/> <tool id="com.crt.advproject.cpp.lib.release.1346216254" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.lib.release">
<tool id="com.crt.advproject.gcc.lib.release.2019613487" name="MCU C Compiler" superClass="com.crt.advproject.gcc.lib.release"> <option id="com.crt.advproject.cpp.thumb.704134014" name="Thumb mode" superClass="com.crt.advproject.cpp.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.crt.advproject.gcc.thumb.1320467727" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/> <option id="com.crt.advproject.cpp.specs.1631764716" name="Specs" superClass="com.crt.advproject.cpp.specs" useByScannerDiscovery="false" value="com.crt.advproject.cpp.specs.newlib" valueType="enumerated"/>
<option id="com.crt.advproject.gcc.arch.689637409" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/> <option id="com.crt.advproject.cpp.arch.1972156308" name="Architecture" superClass="com.crt.advproject.cpp.arch" useByScannerDiscovery="true" value="com.crt.advproject.cpp.target.cm3" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.2111725943" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.154862246" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="NDEBUG"/> <listOptionValue builtIn="false" value="NDEBUG"/>
<listOptionValue builtIn="false" value="__CODE_RED"/> <listOptionValue builtIn="false" value="__CODE_RED"/>
<listOptionValue builtIn="false" value="__REDLIB__"/> <listOptionValue builtIn="false" value="__NEWLIB__"/>
<listOptionValue builtIn="false" value="CORE_M3"/> <listOptionValue builtIn="false" value="CORE_M3"/>
<listOptionValue builtIn="false" value="__USE_LPCOPEN"/>
<listOptionValue builtIn="false" value="__LPC15XX__"/> <listOptionValue builtIn="false" value="__LPC15XX__"/>
</option> </option>
<option id="gnu.c.compiler.option.misc.other.1628159777" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/> <option id="gnu.cpp.compiler.option.other.other.97112883" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions" valueType="string"/>
<option id="gnu.c.compiler.option.optimization.flags.181489377" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/> <option id="gnu.cpp.compiler.option.optimization.flags.75707207" name="Other optimization flags" superClass="gnu.cpp.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common -Os" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.253607500" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.386692672" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_board_nxp_lpcxpresso_1549/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_chip_15xx/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.c.misc.dialect.878054737" superClass="com.crt.advproject.c.misc.dialect" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/> <option id="com.crt.advproject.cpp.misc.dialect.1026125528" superClass="com.crt.advproject.cpp.misc.dialect" value="com.crt.advproject.misc.dialect.c++11" valueType="enumerated"/>
<option id="com.crt.advproject.gcc.hdrlib.1522606341" superClass="com.crt.advproject.gcc.hdrlib" value="Redlib" valueType="enumerated"/> <option id="com.crt.advproject.cpp.hdrlib.1575397547" superClass="com.crt.advproject.cpp.hdrlib" value="Newlib" valueType="enumerated"/>
<inputType id="com.crt.advproject.compiler.input.1105768945" superClass="com.crt.advproject.compiler.input"/> <inputType id="com.crt.advproject.compiler.cpp.input.1551890212" superClass="com.crt.advproject.compiler.cpp.input"/>
</tool> </tool>
<tool id="com.crt.advproject.gas.lib.release.315184569" name="MCU Assembler" superClass="com.crt.advproject.gas.lib.release"> <tool id="com.crt.advproject.gcc.lib.release.651316468" name="MCU C Compiler" superClass="com.crt.advproject.gcc.lib.release">
<option id="com.crt.advproject.gas.thumb.497126066" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/> <option id="com.crt.advproject.gcc.thumb.1038937887" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<option id="com.crt.advproject.gas.arch.1254846099" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/> <option id="com.crt.advproject.gcc.arch.1939097864" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm3" valueType="enumerated"/>
<option id="gnu.both.asm.option.flags.crt.920976125" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__REDLIB__ -DNDEBUG -D__CODE_RED -DCORE_M3 -D__LPC15XX__" valueType="string"/> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.1167588143" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.302350239" superClass="gnu.both.asm.option.include.paths" valueType="includePath"> <listOptionValue builtIn="false" value="NDEBUG"/>
<listOptionValue builtIn="false" value="__CODE_RED"/>
<listOptionValue builtIn="false" value="CORE_M3"/>
<listOptionValue builtIn="false" value="__USE_LPCOPEN"/>
<listOptionValue builtIn="false" value="__LPC15XX__"/>
<listOptionValue builtIn="false" value="__NEWLIB__"/>
</option>
<option id="gnu.c.compiler.option.misc.other.2101559284" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections" valueType="string"/>
<option id="gnu.c.compiler.option.optimization.flags.1015749175" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.1725679522" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_board_nxp_lpcxpresso_1549/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_chip_15xx/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
</option> </option>
<option id="com.crt.advproject.gas.hdrlib.1403546165" superClass="com.crt.advproject.gas.hdrlib" value="Redlib" valueType="enumerated"/> <option id="com.crt.advproject.c.misc.dialect.1534134428" superClass="com.crt.advproject.c.misc.dialect" value="com.crt.advproject.misc.dialect.c11" valueType="enumerated"/>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1343706223" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> <option id="com.crt.advproject.gcc.hdrlib.781606191" superClass="com.crt.advproject.gcc.hdrlib" value="Newlib" valueType="enumerated"/>
<inputType id="com.crt.advproject.assembler.input.1776905299" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/> <option id="com.crt.advproject.gcc.specs.1937017826" superClass="com.crt.advproject.gcc.specs" value="com.crt.advproject.gcc.specs.newlib" valueType="enumerated"/>
<inputType id="com.crt.advproject.compiler.input.773190247" superClass="com.crt.advproject.compiler.input"/>
</tool> </tool>
<tool id="com.crt.advproject.ar.lib.release.297408706" name="MCU Archiver" superClass="com.crt.advproject.ar.lib.release"/> <tool id="com.crt.advproject.gas.lib.release.297243120" name="MCU Assembler" superClass="com.crt.advproject.gas.lib.release">
<option id="com.crt.advproject.gas.thumb.1919799426" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
<option id="com.crt.advproject.gas.arch.129562775" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm3" valueType="enumerated"/>
<option id="gnu.both.asm.option.flags.crt.701710812" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -DNDEBUG -D__CODE_RED -DCORE_M3 -D__USE_LPCOPEN -D__LPC15XX__ -D__NEWLIB__" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.438433668" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_board_nxp_lpcxpresso_1549/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/lpc_chip_15xx/inc}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc://inc}&quot;"/>
</option>
<option id="com.crt.advproject.gas.hdrlib.951500934" superClass="com.crt.advproject.gas.hdrlib" value="Newlib" valueType="enumerated"/>
<option id="com.crt.advproject.gas.specs.1455244390" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlib" valueType="enumerated"/>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1609791713" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
<inputType id="com.crt.advproject.assembler.input.2140703805" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
</tool>
<tool id="com.crt.advproject.ar.lib.release.259759157" name="MCU Archiver" superClass="com.crt.advproject.ar.lib.release"/>
</toolChain> </toolChain>
</folderInfo> </folderInfo>
<sourceEntries> <sourceEntries>
@ -146,40 +202,41 @@
</cconfiguration> </cconfiguration>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="Modbus.com.crt.advproject.projecttype.lib.310838571" name="Static Library" projectType="com.crt.advproject.projecttype.lib"/> <project id="Modbus.com.crt.advproject.projecttype.lib.1018194361" name="Static Library" projectType="com.crt.advproject.projecttype.lib"/>
</storageModule> </storageModule>
<storageModule moduleId="scannerConfiguration"> <storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="com.crt.config"> <storageModule moduleId="com.crt.config">
<projectStorage>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&#13; <projectStorage>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;TargetConfig&gt;&#13; &lt;TargetConfig&gt;
&lt;Properties property_2="LPC15xx_256K.cfx" property_3="NXP" property_4="LPC1549" property_count="5" version="100300"/&gt;&#13; &lt;Properties property_2="LPC15xx_256K.cfx" property_3="NXP" property_4="LPC1549" property_count="5" version="100300"/&gt;
&lt;infoList vendor="NXP"&gt;&#13; &lt;infoList vendor="NXP"&gt;
&lt;info chip="LPC1549" connectscript="LPC15RunBootRomConnect.scp" flash_driver="LPC15xx_256K.cfx" match_id="0x0" name="LPC1549" resetscript="LPC15RunBootRomReset.scp" stub="crt_emu_cm3_gen"&gt;&#13; &lt;info chip="LPC1549" connectscript="LPC15RunBootRomConnect.scp" flash_driver="LPC15xx_256K.cfx" match_id="0x0" name="LPC1549" resetscript="LPC15RunBootRomReset.scp" stub="crt_emu_cm3_gen"&gt;
&lt;chip&gt;&#13; &lt;chip&gt;
&lt;name&gt;LPC1549&lt;/name&gt;&#13; &lt;name&gt;LPC1549&lt;/name&gt;
&lt;family&gt;LPC15xx&lt;/family&gt;&#13; &lt;family&gt;LPC15xx&lt;/family&gt;
&lt;vendor&gt;NXP (formerly Philips)&lt;/vendor&gt;&#13; &lt;vendor&gt;NXP (formerly Philips)&lt;/vendor&gt;
&lt;reset board="None" core="Real" sys="Real"/&gt;&#13; &lt;reset board="None" core="Real" sys="Real"/&gt;
&lt;clock changeable="TRUE" freq="12MHz" is_accurate="TRUE"/&gt;&#13; &lt;clock changeable="TRUE" freq="12MHz" is_accurate="TRUE"/&gt;
&lt;memory can_program="true" id="Flash" is_ro="true" type="Flash"/&gt;&#13; &lt;memory can_program="true" id="Flash" is_ro="true" type="Flash"/&gt;
&lt;memory id="RAM" type="RAM"/&gt;&#13; &lt;memory id="RAM" type="RAM"/&gt;
&lt;memory id="Periph" is_volatile="true" type="Peripheral"/&gt;&#13; &lt;memory id="Periph" is_volatile="true" type="Peripheral"/&gt;
&lt;memoryInstance derived_from="Flash" id="MFlash256" location="0x0" size="0x40000"/&gt;&#13; &lt;memoryInstance derived_from="Flash" id="MFlash256" location="0x0" size="0x40000"/&gt;
&lt;memoryInstance derived_from="RAM" id="Ram0_16" location="0x2000000" size="0x4000"/&gt;&#13; &lt;memoryInstance derived_from="RAM" id="Ram0_16" location="0x2000000" size="0x4000"/&gt;
&lt;memoryInstance derived_from="RAM" id="Ram1_16" location="0x2004000" size="0x4000"/&gt;&#13; &lt;memoryInstance derived_from="RAM" id="Ram1_16" location="0x2004000" size="0x4000"/&gt;
&lt;memoryInstance derived_from="RAM" id="Ram2_4" location="0x2008000" size="0x1000"/&gt;&#13; &lt;memoryInstance derived_from="RAM" id="Ram2_4" location="0x2008000" size="0x1000"/&gt;
&lt;/chip&gt;&#13; &lt;/chip&gt;
&lt;processor&gt;&#13; &lt;processor&gt;
&lt;name gcc_name="cortex-m3"&gt;Cortex-M3&lt;/name&gt;&#13; &lt;name gcc_name="cortex-m3"&gt;Cortex-M3&lt;/name&gt;
&lt;family&gt;Cortex-M&lt;/family&gt;&#13; &lt;family&gt;Cortex-M&lt;/family&gt;
&lt;/processor&gt;&#13; &lt;/processor&gt;
&lt;/info&gt;&#13; &lt;/info&gt;
&lt;/infoList&gt;&#13; &lt;/infoList&gt;
&lt;/TargetConfig&gt;</projectStorage> &lt;/TargetConfig&gt;</projectStorage>
</storageModule> </storageModule>
<storageModule moduleId="refreshScope"/>
<storageModule moduleId="com.crt.advproject"> <storageModule moduleId="com.crt.advproject">
<boardId>LPCXpresso1549</boardId> <boardId>LPCXpresso1549</boardId>
</storageModule> </storageModule>

View File

@ -3,6 +3,7 @@
<name>Modbus</name> <name>Modbus</name>
<comment></comment> <comment></comment>
<projects> <projects>
<project>lpc_chip_15xx</project>
</projects> </projects>
<buildSpec> <buildSpec>
<buildCommand> <buildCommand>
@ -20,6 +21,7 @@
</buildSpec> </buildSpec>
<natures> <natures>
<nature>org.eclipse.cdt.core.cnature</nature> <nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures> </natures>

View File

@ -1,8 +1,3 @@
<<<<<<< HEAD
=======
>>>>>>> bada194ebe7490c25ca7589366224d4ae0f80eab
#ifndef SERIALPORT_H_ #ifndef SERIALPORT_H_
#define SERIALPORT_H_ #define SERIALPORT_H_

View File

@ -51,11 +51,9 @@ obtain a copy.
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. */ POSSIBILITY OF SUCH DAMAGE. */
#ifndef _UTIL_CRC16_H_ #ifndef _UTIL_CRC16_H_
#define _UTIL_CRC16_H_ #define _UTIL_CRC16_H_
/** @ingroup util_crc16 /** @ingroup util_crc16
Processor-independent CRC-16 calculation. Processor-independent CRC-16 calculation.
@ -68,7 +66,8 @@ obtain a copy.
@param uint8_t a (0x00..0xFF) @param uint8_t a (0x00..0xFF)
@return calculated CRC (0x0000..0xFFFF) @return calculated CRC (0x0000..0xFFFF)
*/ */
static uint16_t crc16_update(uint16_t crc, uint8_t a) static uint16_t
crc16_update (uint16_t crc, uint8_t a)
{ {
int i; int i;
@ -84,5 +83,4 @@ static uint16_t crc16_update(uint16_t crc, uint8_t a)
return crc; return crc;
} }
#endif /* _UTIL_CRC16_H_ */ #endif /* _UTIL_CRC16_H_ */

View File

@ -1,6 +1,7 @@
/** /**
@file @file
Arduino library for communicating with Modbus slaves over RS232/485 (via RTU protocol). Arduino library for communicating with Modbus slaves over RS232/485 (via RTU
protocol).
*/ */
/* /*
@ -27,24 +28,26 @@ Arduino library for communicating with Modbus slaves over RS232/485 (via RTU pro
*/ */
/* _____PROJECT INCLUDES_____________________________________________________
/* _____PROJECT INCLUDES_____________________________________________________ */ */
#include "ModbusMaster.h" #include "ModbusMaster.h"
#include "crc16.h" #include "crc16.h"
/* _____GLOBAL VARIABLES_____________________________________________________
/* _____GLOBAL VARIABLES_____________________________________________________ */ */
#if defined(ARDUINO_ARCH_AVR) #if defined(ARDUINO_ARCH_AVR)
HardwareSerial* MBSerial = &Serial; ///< Pointer to Serial class object HardwareSerial *MBSerial = &Serial; ///< Pointer to Serial class object
#elif defined(ARDUINO_ARCH_SAM) #elif defined(ARDUINO_ARCH_SAM)
UARTClass* MBSerial = &Serial; ///< Pointer to Serial class object UARTClass *MBSerial = &Serial; ///< Pointer to Serial class object
#else #else
//In the case of undefined Serial the code should still function // In the case of undefined Serial the code should still function
// #error "This library only supports boards with an AVR or SAM processor. Please open an issue at https://github.com/4-20ma/ModbusMaster/issues and indicate which processor/platform you're using." // #error "This library only supports boards with an AVR or SAM processor.
// Please open an issue at https://github.com/4-20ma/ModbusMaster/issues and
// indicate which processor/platform you're using."
#endif #endif
/* _____PUBLIC FUNCTIONS_____________________________________________________
/* _____PUBLIC FUNCTIONS_____________________________________________________ */ */
/** /**
Constructor. Constructor.
@ -52,14 +55,13 @@ Creates class object using default serial port 0, Modbus slave ID 1.
@ingroup setup @ingroup setup
*/ */
ModbusMaster::ModbusMaster(void) ModbusMaster::ModbusMaster (void)
{ {
_u8SerialPort = 0; _u8SerialPort = 0;
_u8MBSlave = 1; _u8MBSlave = 1;
_u16BaudRate = 0; _u16BaudRate = 0;
} }
/** /**
Constructor. Constructor.
@ -69,32 +71,31 @@ Creates class object using default serial port 0, specified Modbus slave ID.
@param u8MBSlave Modbus slave ID (1..255) @param u8MBSlave Modbus slave ID (1..255)
@ingroup setup @ingroup setup
*/ */
ModbusMaster::ModbusMaster(uint8_t u8MBSlave) ModbusMaster::ModbusMaster (uint8_t u8MBSlave)
{ {
_u8SerialPort = 0; _u8SerialPort = 0;
_u8MBSlave = u8MBSlave; _u8MBSlave = u8MBSlave;
_u16BaudRate = 0; _u16BaudRate = 0;
} }
/** /**
Constructor. Constructor.
Creates class object using specified serial port, Modbus slave ID. Creates class object using specified serial port, Modbus slave ID.
@overload void ModbusMaster::ModbusMaster(uint8_t u8SerialPort, uint8_t u8MBSlave) @overload void ModbusMaster::ModbusMaster(uint8_t u8SerialPort, uint8_t
u8MBSlave)
@param u8SerialPort serial port (Serial, Serial1..Serial3) @param u8SerialPort serial port (Serial, Serial1..Serial3)
@param u8MBSlave Modbus slave ID (1..255) @param u8MBSlave Modbus slave ID (1..255)
@ingroup setup @ingroup setup
*/ */
ModbusMaster::ModbusMaster(uint8_t u8SerialPort, uint8_t u8MBSlave) ModbusMaster::ModbusMaster (uint8_t u8SerialPort, uint8_t u8MBSlave)
{ {
_u8SerialPort = (u8SerialPort > 3) ? 0 : u8SerialPort; _u8SerialPort = (u8SerialPort > 3) ? 0 : u8SerialPort;
_u8MBSlave = u8MBSlave; _u8MBSlave = u8MBSlave;
_u16BaudRate = 0; _u16BaudRate = 0;
} }
/** /**
Initialize class object. Initialize class object.
@ -103,12 +104,12 @@ Call once class has been instantiated, typically within setup().
@ingroup setup @ingroup setup
*/ */
void ModbusMaster::begin(void) void
ModbusMaster::begin (void)
{ {
begin(19200); begin (19200);
} }
/** /**
Initialize class object. Initialize class object.
@ -119,9 +120,10 @@ Call once class has been instantiated, typically within setup().
@param u16BaudRate baud rate, in standard increments (300..115200) @param u16BaudRate baud rate, in standard increments (300..115200)
@ingroup setup @ingroup setup
*/ */
void ModbusMaster::begin(uint16_t u16BaudRate) void
ModbusMaster::begin (uint16_t u16BaudRate)
{ {
// txBuffer = (uint16_t*) calloc(ku8MaxBufferSize, sizeof(uint16_t)); // txBuffer = (uint16_t*) calloc(ku8MaxBufferSize, sizeof(uint16_t));
_u8TransmitBufferIndex = 0; _u8TransmitBufferIndex = 0;
u16TransmitBufferLength = 0; u16TransmitBufferLength = 0;
@ -153,10 +155,12 @@ void ModbusMaster::begin(uint16_t u16BaudRate)
} }
#endif #endif
if(MBSerial == NULL) MBSerial = new SerialPort; if (MBSerial == NULL)
if(u16BaudRate != _u16BaudRate) { MBSerial = new SerialPort;
if (u16BaudRate != _u16BaudRate)
{
_u16BaudRate = u16BaudRate; _u16BaudRate = u16BaudRate;
MBSerial->begin(u16BaudRate); MBSerial->begin (u16BaudRate);
} }
_idle = NULL; _idle = NULL;
@ -166,8 +170,8 @@ void ModbusMaster::begin(uint16_t u16BaudRate)
#endif #endif
} }
void
void ModbusMaster::beginTransmission(uint16_t u16Address) ModbusMaster::beginTransmission (uint16_t u16Address)
{ {
_u16WriteAddress = u16Address; _u16WriteAddress = u16Address;
_u8TransmitBufferIndex = 0; _u8TransmitBufferIndex = 0;
@ -175,10 +179,12 @@ void ModbusMaster::beginTransmission(uint16_t u16Address)
} }
// eliminate this function in favor of using existing MB request functions // eliminate this function in favor of using existing MB request functions
uint8_t ModbusMaster::requestFrom(uint16_t address, uint16_t quantity) uint8_t
ModbusMaster::requestFrom (uint16_t address, uint16_t quantity)
{ {
uint8_t read; uint8_t read;
read = 1; // krl: added this to prevent warning. This method is not called anywhere... read = 1; // krl: added this to prevent warning. This method is not called
// anywhere...
// clamp to buffer length // clamp to buffer length
if (quantity > ku8MaxBufferSize) if (quantity > ku8MaxBufferSize)
{ {
@ -191,8 +197,8 @@ uint8_t ModbusMaster::requestFrom(uint16_t address, uint16_t quantity)
return read; return read;
} }
void
void ModbusMaster::sendBit(bool data) ModbusMaster::sendBit (bool data)
{ {
uint8_t txBitIndex = u16TransmitBufferLength % 16; uint8_t txBitIndex = u16TransmitBufferLength % 16;
if ((u16TransmitBufferLength >> 4) < ku8MaxBufferSize) if ((u16TransmitBufferLength >> 4) < ku8MaxBufferSize)
@ -201,14 +207,14 @@ void ModbusMaster::sendBit(bool data)
{ {
_u16TransmitBuffer[_u8TransmitBufferIndex] = 0; _u16TransmitBuffer[_u8TransmitBufferIndex] = 0;
} }
bitWrite(_u16TransmitBuffer[_u8TransmitBufferIndex], txBitIndex, data); bitWrite (_u16TransmitBuffer[_u8TransmitBufferIndex], txBitIndex, data);
u16TransmitBufferLength++; u16TransmitBufferLength++;
_u8TransmitBufferIndex = u16TransmitBufferLength >> 4; _u8TransmitBufferIndex = u16TransmitBufferLength >> 4;
} }
} }
void
void ModbusMaster::send(uint16_t data) ModbusMaster::send (uint16_t data)
{ {
if (_u8TransmitBufferIndex < ku8MaxBufferSize) if (_u8TransmitBufferIndex < ku8MaxBufferSize)
{ {
@ -217,34 +223,27 @@ void ModbusMaster::send(uint16_t data)
} }
} }
void
void ModbusMaster::send(uint32_t data) ModbusMaster::send (uint32_t data)
{ {
send(lowWord(data)); send (lowWord (data));
send(highWord(data)); send (highWord (data));
} }
void
void ModbusMaster::send(uint8_t data) ModbusMaster::send (uint8_t data)
{ {
send(word(data)); send (word (data));
} }
uint8_t
ModbusMaster::available (void)
uint8_t ModbusMaster::available(void)
{ {
return _u8ResponseBufferLength - _u8ResponseBufferIndex; return _u8ResponseBufferLength - _u8ResponseBufferIndex;
} }
uint16_t
uint16_t ModbusMaster::receive(void) ModbusMaster::receive (void)
{ {
if (_u8ResponseBufferIndex < _u8ResponseBufferLength) if (_u8ResponseBufferIndex < _u8ResponseBufferLength)
{ {
@ -256,13 +255,6 @@ uint16_t ModbusMaster::receive(void)
} }
} }
/** /**
Set idle time callback function (cooperative multitasking). Set idle time callback function (cooperative multitasking).
@ -273,12 +265,12 @@ serial ports, etc. is permitted within callback function.
@see ModbusMaster::ModbusMasterTransaction() @see ModbusMaster::ModbusMasterTransaction()
*/ */
void ModbusMaster::idle(void (*idle)()) void
ModbusMaster::idle (void (*idle) ())
{ {
_idle = idle; _idle = idle;
} }
/** /**
Retrieve data from response buffer. Retrieve data from response buffer.
@ -287,7 +279,8 @@ Retrieve data from response buffer.
@return value in position u8Index of response buffer (0x0000..0xFFFF) @return value in position u8Index of response buffer (0x0000..0xFFFF)
@ingroup buffer @ingroup buffer
*/ */
uint16_t ModbusMaster::getResponseBuffer(uint8_t u8Index) uint16_t
ModbusMaster::getResponseBuffer (uint8_t u8Index)
{ {
if (u8Index < ku8MaxBufferSize) if (u8Index < ku8MaxBufferSize)
{ {
@ -299,14 +292,14 @@ uint16_t ModbusMaster::getResponseBuffer(uint8_t u8Index)
} }
} }
/** /**
Clear Modbus response buffer. Clear Modbus response buffer.
@see ModbusMaster::getResponseBuffer(uint8_t u8Index) @see ModbusMaster::getResponseBuffer(uint8_t u8Index)
@ingroup buffer @ingroup buffer
*/ */
void ModbusMaster::clearResponseBuffer() void
ModbusMaster::clearResponseBuffer ()
{ {
uint8_t i; uint8_t i;
@ -316,17 +309,18 @@ void ModbusMaster::clearResponseBuffer()
} }
} }
/** /**
Place data in transmit buffer. Place data in transmit buffer.
@see ModbusMaster::clearTransmitBuffer() @see ModbusMaster::clearTransmitBuffer()
@param u8Index index of transmit buffer array (0x00..0x3F) @param u8Index index of transmit buffer array (0x00..0x3F)
@param u16Value value to place in position u8Index of transmit buffer (0x0000..0xFFFF) @param u16Value value to place in position u8Index of transmit buffer
(0x0000..0xFFFF)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup buffer @ingroup buffer
*/ */
uint8_t ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value) uint8_t
ModbusMaster::setTransmitBuffer (uint8_t u8Index, uint16_t u16Value)
{ {
if (u8Index < ku8MaxBufferSize) if (u8Index < ku8MaxBufferSize)
{ {
@ -339,14 +333,14 @@ uint8_t ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value)
} }
} }
/** /**
Clear Modbus transmit buffer. Clear Modbus transmit buffer.
@see ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value) @see ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value)
@ingroup buffer @ingroup buffer
*/ */
void ModbusMaster::clearTransmitBuffer() void
ModbusMaster::clearTransmitBuffer ()
{ {
uint8_t i; uint8_t i;
@ -356,7 +350,6 @@ void ModbusMaster::clearTransmitBuffer()
} }
} }
/** /**
Modbus function 0x01 Read Coils. Modbus function 0x01 Read Coils.
@ -380,14 +373,14 @@ order end of the word).
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup discrete @ingroup discrete
*/ */
uint8_t ModbusMaster::readCoils(uint16_t u16ReadAddress, uint16_t u16BitQty) uint8_t
ModbusMaster::readCoils (uint16_t u16ReadAddress, uint16_t u16BitQty)
{ {
_u16ReadAddress = u16ReadAddress; _u16ReadAddress = u16ReadAddress;
_u16ReadQty = u16BitQty; _u16ReadQty = u16BitQty;
return ModbusMasterTransaction(ku8MBReadCoils); return ModbusMasterTransaction (ku8MBReadCoils);
} }
/** /**
Modbus function 0x02 Read Discrete Inputs. Modbus function 0x02 Read Discrete Inputs.
@ -407,19 +400,19 @@ bits in the final data word will be padded with zeros (toward the high
order end of the word). order end of the word).
@param u16ReadAddress address of first discrete input (0x0000..0xFFFF) @param u16ReadAddress address of first discrete input (0x0000..0xFFFF)
@param u16BitQty quantity of discrete inputs to read (1..2000, enforced by remote device) @param u16BitQty quantity of discrete inputs to read (1..2000, enforced by
remote device)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup discrete @ingroup discrete
*/ */
uint8_t ModbusMaster::readDiscreteInputs(uint16_t u16ReadAddress, uint8_t
uint16_t u16BitQty) ModbusMaster::readDiscreteInputs (uint16_t u16ReadAddress, uint16_t u16BitQty)
{ {
_u16ReadAddress = u16ReadAddress; _u16ReadAddress = u16ReadAddress;
_u16ReadQty = u16BitQty; _u16ReadQty = u16BitQty;
return ModbusMasterTransaction(ku8MBReadDiscreteInputs); return ModbusMasterTransaction (ku8MBReadDiscreteInputs);
} }
/** /**
Modbus function 0x03 Read Holding Registers. Modbus function 0x03 Read Holding Registers.
@ -432,19 +425,20 @@ The register data in the response buffer is packed as one word per
register. register.
@param u16ReadAddress address of the first holding register (0x0000..0xFFFF) @param u16ReadAddress address of the first holding register (0x0000..0xFFFF)
@param u16ReadQty quantity of holding registers to read (1..125, enforced by remote device) @param u16ReadQty quantity of holding registers to read (1..125, enforced by
remote device)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup register @ingroup register
*/ */
uint8_t ModbusMaster::readHoldingRegisters(uint16_t u16ReadAddress, uint8_t
ModbusMaster::readHoldingRegisters (uint16_t u16ReadAddress,
uint16_t u16ReadQty) uint16_t u16ReadQty)
{ {
_u16ReadAddress = u16ReadAddress; _u16ReadAddress = u16ReadAddress;
_u16ReadQty = u16ReadQty; _u16ReadQty = u16ReadQty;
return ModbusMasterTransaction(ku8MBReadHoldingRegisters); return ModbusMasterTransaction (ku8MBReadHoldingRegisters);
} }
/** /**
Modbus function 0x04 Read Input Registers. Modbus function 0x04 Read Input Registers.
@ -457,19 +451,19 @@ The register data in the response buffer is packed as one word per
register. register.
@param u16ReadAddress address of the first input register (0x0000..0xFFFF) @param u16ReadAddress address of the first input register (0x0000..0xFFFF)
@param u16ReadQty quantity of input registers to read (1..125, enforced by remote device) @param u16ReadQty quantity of input registers to read (1..125, enforced by
remote device)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup register @ingroup register
*/ */
uint8_t ModbusMaster::readInputRegisters(uint16_t u16ReadAddress, uint8_t
uint8_t u16ReadQty) ModbusMaster::readInputRegisters (uint16_t u16ReadAddress, uint8_t u16ReadQty)
{ {
_u16ReadAddress = u16ReadAddress; _u16ReadAddress = u16ReadAddress;
_u16ReadQty = u16ReadQty; _u16ReadQty = u16ReadQty;
return ModbusMasterTransaction(ku8MBReadInputRegisters); return ModbusMasterTransaction (ku8MBReadInputRegisters);
} }
/** /**
Modbus function 0x05 Write Single Coil. Modbus function 0x05 Write Single Coil.
@ -484,14 +478,14 @@ address of the coil to be forced. Coils are addressed starting at zero.
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup discrete @ingroup discrete
*/ */
uint8_t ModbusMaster::writeSingleCoil(uint16_t u16WriteAddress, uint8_t u8State) uint8_t
ModbusMaster::writeSingleCoil (uint16_t u16WriteAddress, uint8_t u8State)
{ {
_u16WriteAddress = u16WriteAddress; _u16WriteAddress = u16WriteAddress;
_u16WriteQty = (u8State ? 0xFF00 : 0x0000); _u16WriteQty = (u8State ? 0xFF00 : 0x0000);
return ModbusMasterTransaction(ku8MBWriteSingleCoil); return ModbusMasterTransaction (ku8MBWriteSingleCoil);
} }
/** /**
Modbus function 0x06 Write Single Register. Modbus function 0x06 Write Single Register.
@ -504,16 +498,16 @@ written. Registers are addressed starting at zero.
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup register @ingroup register
*/ */
uint8_t ModbusMaster::writeSingleRegister(uint16_t u16WriteAddress, uint8_t
ModbusMaster::writeSingleRegister (uint16_t u16WriteAddress,
uint16_t u16WriteValue) uint16_t u16WriteValue)
{ {
_u16WriteAddress = u16WriteAddress; _u16WriteAddress = u16WriteAddress;
_u16WriteQty = 0; _u16WriteQty = 0;
_u16TransmitBuffer[0] = u16WriteValue; _u16TransmitBuffer[0] = u16WriteValue;
return ModbusMasterTransaction(ku8MBWriteSingleRegister); return ModbusMasterTransaction (ku8MBWriteSingleRegister);
} }
/** /**
Modbus function 0x0F Write Multiple Coils. Modbus function 0x0F Write Multiple Coils.
@ -526,24 +520,25 @@ buffer. A logical '1' in a bit position of the buffer requests the
corresponding output to be ON. A logical '0' requests it to be OFF. corresponding output to be ON. A logical '0' requests it to be OFF.
@param u16WriteAddress address of the first coil (0x0000..0xFFFF) @param u16WriteAddress address of the first coil (0x0000..0xFFFF)
@param u16BitQty quantity of coils to write (1..2000, enforced by remote device) @param u16BitQty quantity of coils to write (1..2000, enforced by remote
device)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup discrete @ingroup discrete
*/ */
uint8_t ModbusMaster::writeMultipleCoils(uint16_t u16WriteAddress, uint8_t
uint16_t u16BitQty) ModbusMaster::writeMultipleCoils (uint16_t u16WriteAddress, uint16_t u16BitQty)
{ {
_u16WriteAddress = u16WriteAddress; _u16WriteAddress = u16WriteAddress;
_u16WriteQty = u16BitQty; _u16WriteQty = u16BitQty;
return ModbusMasterTransaction(ku8MBWriteMultipleCoils); return ModbusMasterTransaction (ku8MBWriteMultipleCoils);
} }
uint8_t ModbusMaster::writeMultipleCoils() uint8_t
ModbusMaster::writeMultipleCoils ()
{ {
_u16WriteQty = u16TransmitBufferLength; _u16WriteQty = u16TransmitBufferLength;
return ModbusMasterTransaction(ku8MBWriteMultipleCoils); return ModbusMasterTransaction (ku8MBWriteMultipleCoils);
} }
/** /**
Modbus function 0x10 Write Multiple Registers. Modbus function 0x10 Write Multiple Registers.
@ -554,26 +549,28 @@ The requested written values are specified in the transmit buffer. Data
is packed as one word per register. is packed as one word per register.
@param u16WriteAddress address of the holding register (0x0000..0xFFFF) @param u16WriteAddress address of the holding register (0x0000..0xFFFF)
@param u16WriteQty quantity of holding registers to write (1..123, enforced by remote device) @param u16WriteQty quantity of holding registers to write (1..123, enforced by
remote device)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup register @ingroup register
*/ */
uint8_t ModbusMaster::writeMultipleRegisters(uint16_t u16WriteAddress, uint8_t
ModbusMaster::writeMultipleRegisters (uint16_t u16WriteAddress,
uint16_t u16WriteQty) uint16_t u16WriteQty)
{ {
_u16WriteAddress = u16WriteAddress; _u16WriteAddress = u16WriteAddress;
_u16WriteQty = u16WriteQty; _u16WriteQty = u16WriteQty;
return ModbusMasterTransaction(ku8MBWriteMultipleRegisters); return ModbusMasterTransaction (ku8MBWriteMultipleRegisters);
} }
// new version based on Wire.h // new version based on Wire.h
uint8_t ModbusMaster::writeMultipleRegisters() uint8_t
ModbusMaster::writeMultipleRegisters ()
{ {
_u16WriteQty = _u8TransmitBufferIndex; _u16WriteQty = _u8TransmitBufferIndex;
return ModbusMasterTransaction(ku8MBWriteMultipleRegisters); return ModbusMasterTransaction (ku8MBWriteMultipleRegisters);
} }
/** /**
Modbus function 0x16 Mask Write Register. Modbus function 0x16 Mask Write Register.
@ -596,16 +593,16 @@ Result = (Current Contents && And_Mask) || (Or_Mask && (~And_Mask))
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup register @ingroup register
*/ */
uint8_t ModbusMaster::maskWriteRegister(uint16_t u16WriteAddress, uint8_t
uint16_t u16AndMask, uint16_t u16OrMask) ModbusMaster::maskWriteRegister (uint16_t u16WriteAddress, uint16_t u16AndMask,
uint16_t u16OrMask)
{ {
_u16WriteAddress = u16WriteAddress; _u16WriteAddress = u16WriteAddress;
_u16TransmitBuffer[0] = u16AndMask; _u16TransmitBuffer[0] = u16AndMask;
_u16TransmitBuffer[1] = u16OrMask; _u16TransmitBuffer[1] = u16OrMask;
return ModbusMasterTransaction(ku8MBMaskWriteRegister); return ModbusMasterTransaction (ku8MBMaskWriteRegister);
} }
/** /**
Modbus function 0x17 Read Write Multiple Registers. Modbus function 0x17 Read Write Multiple Registers.
@ -620,32 +617,38 @@ holding registers. The data to be written is specified in the transmit
buffer. buffer.
@param u16ReadAddress address of the first holding register (0x0000..0xFFFF) @param u16ReadAddress address of the first holding register (0x0000..0xFFFF)
@param u16ReadQty quantity of holding registers to read (1..125, enforced by remote device) @param u16ReadQty quantity of holding registers to read (1..125, enforced by
remote device)
@param u16WriteAddress address of the first holding register (0x0000..0xFFFF) @param u16WriteAddress address of the first holding register (0x0000..0xFFFF)
@param u16WriteQty quantity of holding registers to write (1..121, enforced by remote device) @param u16WriteQty quantity of holding registers to write (1..121, enforced by
remote device)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
@ingroup register @ingroup register
*/ */
uint8_t ModbusMaster::readWriteMultipleRegisters(uint16_t u16ReadAddress, uint8_t
uint16_t u16ReadQty, uint16_t u16WriteAddress, uint16_t u16WriteQty) ModbusMaster::readWriteMultipleRegisters (uint16_t u16ReadAddress,
uint16_t u16ReadQty,
uint16_t u16WriteAddress,
uint16_t u16WriteQty)
{ {
_u16ReadAddress = u16ReadAddress; _u16ReadAddress = u16ReadAddress;
_u16ReadQty = u16ReadQty; _u16ReadQty = u16ReadQty;
_u16WriteAddress = u16WriteAddress; _u16WriteAddress = u16WriteAddress;
_u16WriteQty = u16WriteQty; _u16WriteQty = u16WriteQty;
return ModbusMasterTransaction(ku8MBReadWriteMultipleRegisters); return ModbusMasterTransaction (ku8MBReadWriteMultipleRegisters);
} }
uint8_t ModbusMaster::readWriteMultipleRegisters(uint16_t u16ReadAddress, uint8_t
ModbusMaster::readWriteMultipleRegisters (uint16_t u16ReadAddress,
uint16_t u16ReadQty) uint16_t u16ReadQty)
{ {
_u16ReadAddress = u16ReadAddress; _u16ReadAddress = u16ReadAddress;
_u16ReadQty = u16ReadQty; _u16ReadQty = u16ReadQty;
_u16WriteQty = _u8TransmitBufferIndex; _u16WriteQty = _u8TransmitBufferIndex;
return ModbusMasterTransaction(ku8MBReadWriteMultipleRegisters); return ModbusMasterTransaction (ku8MBReadWriteMultipleRegisters);
} }
/* _____PRIVATE FUNCTIONS____________________________________________________
/* _____PRIVATE FUNCTIONS____________________________________________________ */ */
/** /**
Modbus transaction engine. Modbus transaction engine.
Sequence: Sequence:
@ -659,7 +662,8 @@ Sequence:
@param u8MBFunction Modbus function (0x01..0xFF) @param u8MBFunction Modbus function (0x01..0xFF)
@return 0 on success; exception number on failure @return 0 on success; exception number on failure
*/ */
uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction) uint8_t
ModbusMaster::ModbusMasterTransaction (uint8_t u8MBFunction)
{ {
uint8_t u8ModbusADU[256]; uint8_t u8ModbusADU[256];
uint8_t u8ModbusADUSize = 0; uint8_t u8ModbusADUSize = 0;
@ -673,21 +677,21 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
u8ModbusADU[u8ModbusADUSize++] = _u8MBSlave; u8ModbusADU[u8ModbusADUSize++] = _u8MBSlave;
u8ModbusADU[u8ModbusADUSize++] = u8MBFunction; u8ModbusADU[u8ModbusADUSize++] = u8MBFunction;
switch(u8MBFunction) switch (u8MBFunction)
{ {
case ku8MBReadCoils: case ku8MBReadCoils:
case ku8MBReadDiscreteInputs: case ku8MBReadDiscreteInputs:
case ku8MBReadInputRegisters: case ku8MBReadInputRegisters:
case ku8MBReadHoldingRegisters: case ku8MBReadHoldingRegisters:
case ku8MBReadWriteMultipleRegisters: case ku8MBReadWriteMultipleRegisters:
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadAddress); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16ReadAddress);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadAddress); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16ReadAddress);
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16ReadQty); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16ReadQty);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16ReadQty); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16ReadQty);
break; break;
} }
switch(u8MBFunction) switch (u8MBFunction)
{ {
case ku8MBWriteSingleCoil: case ku8MBWriteSingleCoil:
case ku8MBMaskWriteRegister: case ku8MBMaskWriteRegister:
@ -695,38 +699,41 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
case ku8MBWriteSingleRegister: case ku8MBWriteSingleRegister:
case ku8MBWriteMultipleRegisters: case ku8MBWriteMultipleRegisters:
case ku8MBReadWriteMultipleRegisters: case ku8MBReadWriteMultipleRegisters:
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteAddress); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16WriteAddress);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteAddress); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16WriteAddress);
break; break;
} }
switch(u8MBFunction) switch (u8MBFunction)
{ {
case ku8MBWriteSingleCoil: case ku8MBWriteSingleCoil:
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16WriteQty);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16WriteQty);
break; break;
case ku8MBWriteSingleRegister: case ku8MBWriteSingleRegister:
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[0]); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16TransmitBuffer[0]);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[0]); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16TransmitBuffer[0]);
break; break;
case ku8MBWriteMultipleCoils: case ku8MBWriteMultipleCoils:
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16WriteQty);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16WriteQty);
u8Qty = (_u16WriteQty % 8) ? ((_u16WriteQty >> 3) + 1) : (_u16WriteQty >> 3); u8Qty = (_u16WriteQty % 8) ? ((_u16WriteQty >> 3) + 1)
: (_u16WriteQty >> 3);
u8ModbusADU[u8ModbusADUSize++] = u8Qty; u8ModbusADU[u8ModbusADUSize++] = u8Qty;
for (i = 0; i < u8Qty; i++) for (i = 0; i < u8Qty; i++)
{ {
switch(i % 2) switch (i % 2)
{ {
case 0: // i is even case 0: // i is even
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[i >> 1]); u8ModbusADU[u8ModbusADUSize++]
= lowByte (_u16TransmitBuffer[i >> 1]);
break; break;
case 1: // i is odd case 1: // i is odd
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[i >> 1]); u8ModbusADU[u8ModbusADUSize++]
= highByte (_u16TransmitBuffer[i >> 1]);
break; break;
} }
} }
@ -734,22 +741,22 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
case ku8MBWriteMultipleRegisters: case ku8MBWriteMultipleRegisters:
case ku8MBReadWriteMultipleRegisters: case ku8MBReadWriteMultipleRegisters:
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16WriteQty); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16WriteQty);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16WriteQty);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16WriteQty << 1); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16WriteQty << 1);
for (i = 0; i < lowByte(_u16WriteQty); i++) for (i = 0; i < lowByte (_u16WriteQty); i++)
{ {
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[i]); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16TransmitBuffer[i]);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[i]); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16TransmitBuffer[i]);
} }
break; break;
case ku8MBMaskWriteRegister: case ku8MBMaskWriteRegister:
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[0]); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16TransmitBuffer[0]);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[0]); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16TransmitBuffer[0]);
u8ModbusADU[u8ModbusADUSize++] = highByte(_u16TransmitBuffer[1]); u8ModbusADU[u8ModbusADUSize++] = highByte (_u16TransmitBuffer[1]);
u8ModbusADU[u8ModbusADUSize++] = lowByte(_u16TransmitBuffer[1]); u8ModbusADU[u8ModbusADUSize++] = lowByte (_u16TransmitBuffer[1]);
break; break;
} }
@ -757,14 +764,15 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
u16CRC = 0xFFFF; u16CRC = 0xFFFF;
for (i = 0; i < u8ModbusADUSize; i++) for (i = 0; i < u8ModbusADUSize; i++)
{ {
u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); u16CRC = crc16_update (u16CRC, u8ModbusADU[i]);
} }
u8ModbusADU[u8ModbusADUSize++] = lowByte(u16CRC); u8ModbusADU[u8ModbusADUSize++] = lowByte (u16CRC);
u8ModbusADU[u8ModbusADUSize++] = highByte(u16CRC); u8ModbusADU[u8ModbusADUSize++] = highByte (u16CRC);
u8ModbusADU[u8ModbusADUSize] = 0; u8ModbusADU[u8ModbusADUSize] = 0;
// flush receive buffer before transmitting request // flush receive buffer before transmitting request
while (MBSerial->read() != -1); while (MBSerial->read () != -1)
;
#if 0 #if 0
// transmit request // transmit request
@ -777,38 +785,38 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
#endif #endif
} }
#else #else
MBSerial->write((char *)u8ModbusADU, u8ModbusADUSize); MBSerial->write ((char *)u8ModbusADU, u8ModbusADUSize);
#endif #endif
//printf("TX: %02X\n", u8ModbusADU[0]); // printf("TX: %02X\n", u8ModbusADU[0]);
u8ModbusADUSize = 0; u8ModbusADUSize = 0;
MBSerial->flush(); // flush transmit buffer MBSerial->flush (); // flush transmit buffer
// loop until we run out of time or bytes, or an error occurs // loop until we run out of time or bytes, or an error occurs
u32StartTime = millis(); u32StartTime = millis ();
while (u8BytesLeft && !u8MBStatus) while (u8BytesLeft && !u8MBStatus)
{ {
if (MBSerial->available()) if (MBSerial->available ())
{ {
#if __MODBUSMASTER_DEBUG__ #if __MODBUSMASTER_DEBUG__
digitalWrite(4, true); digitalWrite (4, true);
#endif #endif
u8ModbusADU[u8ModbusADUSize++] = MBSerial->read(); u8ModbusADU[u8ModbusADUSize++] = MBSerial->read ();
u8BytesLeft--; u8BytesLeft--;
#if __MODBUSMASTER_DEBUG__ #if __MODBUSMASTER_DEBUG__
digitalWrite(4, false); digitalWrite (4, false);
#endif #endif
} }
else else
{ {
#if __MODBUSMASTER_DEBUG__ #if __MODBUSMASTER_DEBUG__
digitalWrite(5, true); digitalWrite (5, true);
#endif #endif
if (_idle) if (_idle)
{ {
_idle(); _idle ();
} }
#if __MODBUSMASTER_DEBUG__ #if __MODBUSMASTER_DEBUG__
digitalWrite(5, false); digitalWrite (5, false);
#endif #endif
} }
@ -822,22 +830,24 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
break; break;
} }
// verify response is for correct Modbus function code (mask exception bit 7) // verify response is for correct Modbus function code (mask
// exception bit 7)
if ((u8ModbusADU[1] & 0x7F) != u8MBFunction) if ((u8ModbusADU[1] & 0x7F) != u8MBFunction)
{ {
u8MBStatus = ku8MBInvalidFunction; u8MBStatus = ku8MBInvalidFunction;
break; break;
} }
// check whether Modbus exception occurred; return Modbus Exception Code // check whether Modbus exception occurred; return Modbus Exception
if (bitRead(u8ModbusADU[1], 7)) // Code
if (bitRead (u8ModbusADU[1], 7))
{ {
u8MBStatus = u8ModbusADU[2]; u8MBStatus = u8ModbusADU[2];
break; break;
} }
// evaluate returned Modbus function code // evaluate returned Modbus function code
switch(u8ModbusADU[1]) switch (u8ModbusADU[1])
{ {
case ku8MBReadCoils: case ku8MBReadCoils:
case ku8MBReadDiscreteInputs: case ku8MBReadDiscreteInputs:
@ -859,7 +869,7 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
break; break;
} }
} }
if ((millis() - u32StartTime) > ku16MBResponseTimeout) if ((millis () - u32StartTime) > ku16MBResponseTimeout)
{ {
u8MBStatus = ku8MBResponseTimedOut; u8MBStatus = ku8MBResponseTimedOut;
} }
@ -872,12 +882,13 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
u16CRC = 0xFFFF; u16CRC = 0xFFFF;
for (i = 0; i < (u8ModbusADUSize - 2); i++) for (i = 0; i < (u8ModbusADUSize - 2); i++)
{ {
u16CRC = crc16_update(u16CRC, u8ModbusADU[i]); u16CRC = crc16_update (u16CRC, u8ModbusADU[i]);
} }
// verify CRC // verify CRC
if (!u8MBStatus && (lowByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 2] || if (!u8MBStatus
highByte(u16CRC) != u8ModbusADU[u8ModbusADUSize - 1])) && (lowByte (u16CRC) != u8ModbusADU[u8ModbusADUSize - 2]
|| highByte (u16CRC) != u8ModbusADU[u8ModbusADUSize - 1]))
{ {
u8MBStatus = ku8MBInvalidCRC; u8MBStatus = ku8MBInvalidCRC;
} }
@ -887,7 +898,7 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
if (!u8MBStatus) if (!u8MBStatus)
{ {
// evaluate returned Modbus function code // evaluate returned Modbus function code
switch(u8ModbusADU[1]) switch (u8ModbusADU[1])
{ {
case ku8MBReadCoils: case ku8MBReadCoils:
case ku8MBReadDiscreteInputs: case ku8MBReadDiscreteInputs:
@ -896,18 +907,20 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
{ {
if (i < ku8MaxBufferSize) if (i < ku8MaxBufferSize)
{ {
_u16ResponseBuffer[i] = word(u8ModbusADU[2 * i + 4], u8ModbusADU[2 * i + 3]); _u16ResponseBuffer[i]
= word (u8ModbusADU[2 * i + 4], u8ModbusADU[2 * i + 3]);
} }
_u8ResponseBufferLength = i; _u8ResponseBufferLength = i;
} }
// in the event of an odd number of bytes, load last byte into zero-padded word // in the event of an odd number of bytes, load last byte into
// zero-padded word
if (u8ModbusADU[2] % 2) if (u8ModbusADU[2] % 2)
{ {
if (i < ku8MaxBufferSize) if (i < ku8MaxBufferSize)
{ {
_u16ResponseBuffer[i] = word(0, u8ModbusADU[2 * i + 3]); _u16ResponseBuffer[i] = word (0, u8ModbusADU[2 * i + 3]);
} }
_u8ResponseBufferLength = i + 1; _u8ResponseBufferLength = i + 1;
@ -922,7 +935,8 @@ uint8_t ModbusMaster::ModbusMasterTransaction(uint8_t u8MBFunction)
{ {
if (i < ku8MaxBufferSize) if (i < ku8MaxBufferSize)
{ {
_u16ResponseBuffer[i] = word(u8ModbusADU[2 * i + 3], u8ModbusADU[2 * i + 4]); _u16ResponseBuffer[i]
= word (u8ModbusADU[2 * i + 3], u8ModbusADU[2 * i + 4]);
} }
_u8ResponseBufferLength = i; _u8ResponseBufferLength = i;