diff --git a/iar/settings/F407_uCOSii_Modbus.wsdt b/iar/settings/F407_uCOSii_Modbus.wsdt
index b730034..5df2486 100644
--- a/iar/settings/F407_uCOSii_Modbus.wsdt
+++ b/iar/settings/F407_uCOSii_Modbus.wsdt
@@ -103,7 +103,7 @@
1
1
1
- 040100001C0013860000040000001B8F000001000000108600005E00000020810000010000000D800000020000000C810000020000000486000002000000568600002D0000001481000001000000008400000100000030840000010000001F810000010000005E8600000A0000000E810000060000000B8100000100000000E10000010000008E860000010000001486000001000000698600000100000005840000010000000086000002000000118600003C00000002840000020000000581000001000000198F000001000000468100002000000010840000060000000886000002000000
+ 160200001D0013860000090000001B8F000001000000108600008C00000020810000010000000D800000020000000C81000002000000048600000200000056860000EF0000001481000001000000008400000100000030840000010000001F810000030000005E8600000B0000000E810000030000000B8100000100000000E10000010000008E860000010000001486000003000000698600000100000005840000010000000086000002000000118600004900000002840000020000000581000001000000198F000001000000468100002900000010840000060000005D860000040000000886000002000000
0000
@@ -409,7 +409,7 @@
Main
- 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000500FFFEFF104700500049004F0050007500500064005F005400790070006500440065006600FFFEFF0E500065006E006400530056002000480061006E0064006C0065007200FFFEFF0F5300790073005400690063006B005F00480061006E0064006C0065007200FFFEFF074200530050005F00430050005500FFFEFF0B4100700070005400690063006B0049006E00690074000000000000000000000000000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800D8100000000000021000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000020022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000
+ 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000500FFFEFF104700500049004F0050007500500064005F005400790070006500440065006600FFFEFF0E500065006E006400530056002000480061006E0064006C0065007200FFFEFF0F5300790073005400690063006B005F00480061006E0064006C0065007200FFFEFF074200530050005F00430050005500FFFEFF0B4100700070005400690063006B0049006E00690074000000000000000000000000000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000000028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000001F000000FFFEFF00000000000000000000000000010000000100000001800D8100000000000021000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000020022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000
34049
@@ -427,7 +427,7 @@
- 010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000001000000030000000000000001000000FFFEFF1B2400570053005F0044004900520024005C002E002E005C006D006F0064006200750073005C006D006F0064006200750073002E00630001000000FFFF010014004966436F6E74656E7453746F72616765496D706CFFFEFF00FFFEFFFF22013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E003300300038003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0030003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0030003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF086D006F0064006200750073002E00630000000000FFFFFFFFFFFFFFFFFFFEFF3264003A005C004900410052005F00500072006F006A006500630074005C0054007200610069006E00430061006D0070005F006600750062006F00770065006E005F004D006F0064006200750073005C006100700070005C006D00610069006E002E006300010000000180FFFEFF00FFFEFFFF24013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E0030003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E003400350038003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E003400350038003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF066D00610069006E002E00630000000000FFFFFFFFFFFFFFFFFFFEFF1F2400570053005F0044004900520024005C002E002E005C0075007300650072005C00730074006D003300320066003400780078005F00690074002E006300010000000180FFFEFF00FFFEFFFF27013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E00390034003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0033003600340037003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0033003600340037003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF0E730074006D003300320066003400780078005F00690074002E00630000000000FFFFFFFFFFFFFFFF0000000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000001000000020000000000000049000000AB060000C8020000
+ 010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000001000000060000000000000001000000FFFEFF1B2400570053005F0044004900520024005C002E002E005C006D006F0064006200750073005C006D006F0064006200750073002E00630001000000FFFF010014004966436F6E74656E7453746F72616765496D706CFFFEFF00FFFEFFFF21013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E00370033003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0030003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0030003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF086D006F0064006200750073002E00630000000000FFFFFFFFFFFFFFFFFFFEFF3264003A005C004900410052005F00500072006F006A006500630074005C0054007200610069006E00430061006D0070005F006600750062006F00770065006E005F004D006F0064006200750073005C006100700070005C006D00610069006E002E006300010000000180FFFEFF00FFFEFFFF24013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E0030003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E003300330039003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E003300330039003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF066D00610069006E002E00630000000000FFFFFFFFFFFFFFFFFFFEFF1F2400570053005F0044004900520024005C002E002E005C0075007300650072005C00730074006D003300320066003400780078005F00690074002E006300010000000180FFFEFF00FFFEFFFF27013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E00390034003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0033003600340037003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0033003600340037003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF0E730074006D003300320066003400780078005F00690074002E00630000000000FFFFFFFFFFFFFFFFFFFEFF242400570053005F0044004900520024005C002E002E005C00750063006F0073005F00690069005C0073006F0075007200630065005C006F0073005F0063006F00720065002E006300010000000180FFFEFF00FFFEFFFF2B013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E0031003700390030003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E00370036003800310033003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E00370036003800310033003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF096F0073005F0063006F00720065002E00630000000000FFFFFFFFFFFFFFFFFFFEFF352400570053005F0044004900520024005C002E002E005C002E002E005C002E002E005C004900410052005C00610072006D005C0069006E0063005C0063005C0044004C00690062005F00500072006F0064007500630074005F0073007400720069006E0067002E006800010000000180FFFEFF00FFFEFFFF27013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E00340034003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0031003500350030003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0031003500350030003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF1A44004C00690062005F00500072006F0064007500630074005F0073007400720069006E0067002E00680020005B0052004F005D0000000000FFFFFFFFFFFFFFFFFFFEFF262400570053005F0044004900520024005C002E002E005C00750063006F0073005F00690069005C0070006F007200740073005C006F0073005F006300700075005F0061002E00610073006D00010000000180FFFEFF00FFFEFFFF28013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E003100340038003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0036003400390038003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0036003400390038003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF0C6F0073005F006300700075005F0061002E00610073006D0000000000FFFFFFFFFFFFFFFF0000000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000001000000020000000000000049000000AB060000C8020000
diff --git a/iar/settings/uCOS_Modbus.dnx b/iar/settings/uCOS_Modbus.dnx
index a5d29e0..0611158 100644
--- a/iar/settings/uCOS_Modbus.dnx
+++ b/iar/settings/uCOS_Modbus.dnx
@@ -24,7 +24,7 @@
0
- 1872421399
+ 1032877867
_ 0
diff --git a/modbus/modbus.c b/modbus/modbus.c
index 4ed2c0c..74dbe1f 100644
--- a/modbus/modbus.c
+++ b/modbus/modbus.c
@@ -8,10 +8,11 @@
uint8_t ModbusErr;
/*0x270F + 1 = K10000 */
uint8_t ModbusCoil[1250]; /*10000/8=1250*/
-uint16_t ModbusReg[10001];
+uint16_t ModbusReg[10000];
/*附加功能:页寄存器*/
uint16_t ModbusExtPage[1] = {0}; /*设置地址为0xFFFE*/
+uint16_t ModbusExtReg[1]; /*地址映射为0x10000*/
/*附加功能:读取所有单数个寄存器*/
uint16_t ModbusExtOdd[1] = {0}; /*设置地址为0xFFFF*/
@@ -31,6 +32,7 @@ uint8_t ModbusReadRegs(uint16_t addres, uint16_t num);
uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data);
uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data);
uint8_t ModbusWriteCoil(uint16_t addres, uint8_t *data);
+uint8_t ModbusExtReadOdd(uint16_t num);
/*USART接收空闲中断*/
@@ -78,6 +80,12 @@ void USART1_IRQHandler(void)
/*modbus响应帧发送*/
void ModbusSend(uint8_t *txBuf, uint16_t len)
{
+ if(DMA_GetCmdStatus(DMA2_Stream7) == ENABLE)
+ {
+ /*等待DMA发送完成*/
+ while(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7) == RESET);
+ }
+
/*先关闭DMA发送通道*/
DMA_Cmd(DMA2_Stream7, DISABLE);
@@ -90,6 +98,9 @@ void ModbusSend(uint8_t *txBuf, uint16_t len)
/*配置发送地址和长度*/
DMA_MemoryTargetConfig(DMA2_Stream7, (uint32_t)txBuf, DMA_Memory_0);
DMA_SetCurrDataCounter(DMA2_Stream7, len);
+
+ /*等待串口发送完成*/
+ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
/*启动 DMA 发送*/
DMA_Cmd(DMA2_Stream7, ENABLE);
@@ -104,8 +115,6 @@ void AppTaskModbusParse (void *p_arg)
uint16_t rxLen;
uint8_t rxBuf[256];
- ModbusReg[10000] = 123;
-
while(1)
{
/*无限期等待接收到数据帧信号量*/
@@ -174,8 +183,16 @@ void AppTaskModbusParse (void *p_arg)
ModbusErr = ModbusErrReply(frame.func, ERR_FUNC);
break;
}
- /*启动发送*/
- ModbusSend(ModbusTxBuf, ModbusTxLen);
+ /*实现附加功能时不在这里启动发送*/
+ if(frame.func == 0x03 && frame.opeAddres == 0XFFFF)
+ {
+ ;
+ }
+ else
+ {
+ /*启动发送*/
+ ModbusSend(ModbusTxBuf, ModbusTxLen);
+ }
}
}
@@ -192,6 +209,10 @@ uint8_t ModbusReadCoils(uint16_t addres, uint16_t num)
uint8_t readVal; /*读取到的形式值*/
uint8_t writeVal; /*写入的形式值*/
+ if(ModbusRxLen < 8)
+ {
+ return ModbusErrReply(0x01, ERR_DATA);
+ }
/*操作地址超限*/
if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
{
@@ -250,6 +271,10 @@ uint8_t ModbusWriteCoils(uint16_t addres, uint16_t num, uint8_t *data)
uint8_t readVal;
uint8_t writeVal;
+ if(ModbusRxLen < 10)
+ {
+ return ModbusErrReply(0x0F, ERR_DATA);
+ }
/*操作地址超限*/
if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
{
@@ -306,10 +331,21 @@ uint8_t ModbusReadRegs(uint16_t addres, uint16_t num)
uint8_t readValL;
uint8_t dataLen;
+ if(ModbusRxLen < 8)
+ {
+ return ModbusErrReply(0x13, ERR_DATA);
+ }
/*操作地址超限*/
if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
{
- return ModbusErrReply(0x03, ERR_OPE_ADDRES);
+ if(addres == 0xFFFF && num == 1)
+ {
+ ;
+ }
+ else
+ {
+ return ModbusErrReply(0x03, ERR_OPE_ADDRES);
+ }
}
/*操作数量超限*/
if(num == 0 || num > 125)
@@ -318,15 +354,21 @@ uint8_t ModbusReadRegs(uint16_t addres, uint16_t num)
}
dataLen = num * 2;
+ /*附加功能:读取0x10000寄存器*/
if(ModbusExtPage[0] == 1 && addres == 0x0000)
{
/*将16位寄存器值拆分为两个8位*/
- readValH = (uint8_t)(ModbusReg[10000] >> 8);
- readValL = (uint8_t)(ModbusReg[10000] & 0x00FF);
+ readValH = (uint8_t)(ModbusExtReg[0] >> 8);
+ readValL = (uint8_t)(ModbusExtReg[0] & 0x00FF);
ModbusTxBuf[3] = readValH;
ModbusTxBuf[4] = readValL;
}
+ /*附加功能:读取大量奇数寄存器*/
+ else if(addres == 0xFFFF && num == 1)
+ {
+ return ModbusExtReadOdd(ModbusExtOdd[0]);
+ }
else
{
for(uint16_t i = 0; i < num; i++)
@@ -357,11 +399,15 @@ uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data)
uint8_t writeValH;
uint8_t writeValL;
uint16_t writeVal;
-
+
+ if(ModbusRxLen < 11)
+ {
+ return ModbusErrReply(0x10, ERR_DATA);
+ }
/*操作地址超限*/
if(addres > 0x270F || (addres + (num - 1)) > 0x270F)
{
- if(addres == 0xFFFE && num == 1)
+ if((addres == 0xFFFE || addres == 0xFFFF) && num == 1)
{
;
}
@@ -376,6 +422,7 @@ uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data)
return ModbusErrReply(0x10, ERR_DATA);
}
+ /*附加功能:读取0x10000寄存器*/
if(addres == 0xFFFE && num == 1)
{
writeValH = data[0];
@@ -385,6 +432,17 @@ uint8_t ModbusWriteRegs(uint16_t addres, uint16_t num, uint8_t *data)
writeVal = ((uint16_t)writeValH << 8) | ((uint16_t)writeValL & 0x00FF);
ModbusExtPage[0] = writeVal;
}
+ /*附加功能:读取大量奇数寄存器*/
+ else if(addres == 0xFFFF && num == 1)
+ {
+ writeValH = data[0];
+ writeValL = data[1];
+
+ /*将要写入两个8位值拼接为16位*/
+ writeVal = ((uint16_t)writeValH << 8) | ((uint16_t)writeValL & 0x00FF);
+ ModbusExtOdd[0] = writeVal;
+ }
+ /*正常功能*/
else
{
for(uint16_t i = 0; i < num; i++)
@@ -497,6 +555,67 @@ uint8_t ModbusWriteReg(uint16_t addres, uint8_t *data)
return 0;
}
+uint8_t ModbusExtReadOdd(uint16_t num)
+{
+ uint8_t i = 0;
+ uint8_t numJ = (num + 124) / 125;
+ uint8_t numI = num % 125;
+
+ uint8_t index;
+ uint16_t indexR;
+ uint8_t readValH;
+ uint8_t readValL;
+ uint8_t dataLen;
+
+ for(uint16_t j = 0; j < numJ; j++)
+ {
+ if(j == numJ - 1)
+ {
+ for(i = 0; i < numI; i++)
+ {
+ index = 3 + (i * 2);
+ indexR = j * 250 + 2 * i + 1;
+ /*将16位寄存器值拆分为两个8位*/
+ readValH = (uint8_t)(ModbusReg[indexR] >> 8);
+ readValL = (uint8_t)(ModbusReg[indexR] & 0x00FF);
+
+ ModbusTxBuf[index] = readValH;
+ ModbusTxBuf[index + 1] = readValL;
+ }
+ dataLen = 2 * numI;
+
+ ModbusTxBuf[0] = SLAVE_ADDRES;
+ ModbusTxBuf[1] = 0x03;
+ ModbusTxBuf[2] = dataLen;
+ AddCrc16(ModbusTxBuf, 3 + dataLen);
+ ModbusTxLen = 5 + dataLen;
+ }
+ else
+ {
+ for(i = 0; i < 125; i++)
+ {
+ index = 3 + (i * 2);
+ indexR = j * 250 + 2 * i + 1;
+ /*将16位寄存器值拆分为两个8位*/
+ readValH = (uint8_t)(ModbusReg[indexR] >> 8);
+ readValL = (uint8_t)(ModbusReg[indexR] & 0x00FF);
+
+ ModbusTxBuf[index] = readValH;
+ ModbusTxBuf[index + 1] = readValL;
+ }
+ dataLen = 250;
+
+ ModbusTxBuf[0] = SLAVE_ADDRES;
+ ModbusTxBuf[1] = 0x03;
+ ModbusTxBuf[2] = dataLen;
+ AddCrc16(ModbusTxBuf, 3 + dataLen);
+ ModbusTxLen = 5 + dataLen;
+ }
+ OSTimeDlyHMSM(0, 0, 0, 10);
+ ModbusSend(ModbusTxBuf, ModbusTxLen);
+ }
+ return 0;
+}
uint8_t ModbusErrReply(uint8_t func, uint8_t err)