FreeModbus Slave For AVR源代码 精简版2 【worldsing 笔记】

时间:2024-07-09 21:02:50

FreeModbus 源码:点击下载

线圈BUG解决(后来发现不一定是BUG)
1、eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen )中的
    usRegAddress++;行注释掉,否则输出线圈0永远无法输出,其它的线圈错位。

2、eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen )中的写操作
   while循环改加入 usBitOffset += 8; 否则8以后的线圈无法进行写操作。
  while( iNCoils > 0 ){
          xMBUtilSetBits( ucRegCoilsBuf, usBitOffset,
                        ( uint8_t )( iNCoils > 8 ? 8 : iNCoils ),
          *pucRegBuffer++ );
          iNCoils -= 8;
          usBitOffset += 8;
          }         

3、细读后发现,usRegAddress++在每个操作下都有,有可能是原版就是有意这么写的,但这样
有违背MODBU协议,也有就是地址0的所有东西是没法操作到的,修改的版本中已可以操作0址
址。

4、合并User.c和rtu.c

 

这回把User.c和function.c合并了,同样的配置,Flash 下降,RAM反了长了点。
4 880 bytes of CODE memory (+             12 range fill )
   977 bytes of DATA memory (+ 14 absolute )

 

ModbusFun.c       整合FreeModbus的功能c代码文件;
ModbusRTU.c       Modbus的RTU模式桢处理,整理FreeModbus去除ASCII模式;
ModbusPort.c      关于硬件的移植包括串口、定时器、桢队列功能实现(目前是单桢处理);
                  (此文件是ATMEGA128硬件的代码,其它CPU需要自己移植)

#define MB_FUNC_HANDLERS_MAX                                    ( 16 )//使用的功能码数量
#define MB_FUNC_OTHER_REP_SLAVEID_BUF                   ( 8 )
#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED          (  1 ) //报告从设备功能
#define MB_FUNC_READ_INPUT_ENABLED                         (  1 ) //读输入寄存器功能
#define MB_FUNC_READ_HOLDING_ENABLED                    (  1 ) //读保持寄存器功能
#define MB_FUNC_WRITE_HOLDING_ENABLED                   (  1 ) //写操持寄存存功能
#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED  (  1 )//写多个操持寄存存功能
#define MB_FUNC_READ_COILS_ENABLED                         (  1 )//读线圈
#define MB_FUNC_WRITE_COIL_ENABLED                          (  1 )//写线圈
#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED       (  1 )//写多个线圈
#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED      (  1 )//读离散输入
#define MB_FUNC_READWRITE_HOLDING_ENABLED          (  1 )//读写多个寄存器

 

测试环境:IAR for avr 5.40 & M128

8K Flash的单片机运行起来没有压力

随后将移植到其它平台有:

FreeModbus for STM32xx

FreeModbus for STM8xx

FreeModbus for LPCxx

FreeModbus for LMxx

FreeModbus for MSP430