Skip to content

Commit 6f401f5

Browse files
Merge pull request #25 from TimerOverflow/20210318
20210318
2 parents fcb21ff + dac35b7 commit 6f401f5

File tree

2 files changed

+42
-27
lines changed

2 files changed

+42
-27
lines changed

AvrModbus.c

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include "AvrModbus.h"
1010
#include "crc16.h"
1111
/*********************************************************************************/
12-
#if(AVR_MODBUS_REVISION_DATE != 20201020)
12+
#if(AVR_MODBUS_REVISION_DATE != 20210318)
1313
#error wrong include file. (AvrModbus.h)
1414
#endif
1515
/*********************************************************************************/
@@ -723,6 +723,7 @@ static void MasterReceive(tag_AvrModbusMasterCtrl *Master)
723723
/*********************************************************************************/
724724
tU8 AvrModbusMasterGeneralInit(tag_AvrModbusMasterCtrl *Master, tag_AvrUartCtrl *Uart, tU8 MaxSlave, tU32 MasterProcTick_us)
725725
{
726+
tU8 i;
726727
/*
727728
1) 인수
728729
- Master : tag_AvrModbusMasterCtrl 인스턴스의 주소.
@@ -738,21 +739,39 @@ tU8 AvrModbusMasterGeneralInit(tag_AvrModbusMasterCtrl *Master, tag_AvrUartCtrl
738739
- Master와 관련된 필수 정보들을 초기화 함.
739740
- 본 함수를 호출하기전 Uart는 선행적으로 초기화가 완료 되어 있어야 함.
740741
*/
741-
742-
if(Uart->Bit.InitComplete == true)
742+
743+
if((Uart == null) || (Uart->Bit.InitComplete != true))
743744
{
744-
Master->Uart = Uart;
745+
return false;
745746
}
747+
//Uart 초기화 여부 검사
746748

747749
Master->SlaveArray = (tag_AvrModbusMasterSlaveInfo *) calloc(MaxSlave, sizeof(tag_AvrModbusMasterSlaveInfo));
750+
if(Master->SlaveArray == null)
751+
{
752+
return false;
753+
}
754+
//tag_AvrModbusMasterSlaveInfo 동적할당
755+
756+
for(i = 0; i < MaxSlave; i++)
757+
{
758+
Master->SlaveArray[i].PollData = (tag_AvrModbusMasterSlavePollData *) calloc(1, sizeof(tag_AvrModbusMasterSlavePollData));
759+
if(Master->SlaveArray[i].PollData == null)
760+
{
761+
return false;
762+
}
763+
}
764+
//tag_AvrModbusMasterSlavePollData 동적 할당
765+
766+
Master->Uart = Uart;
748767
Master->MaxSlave = MaxSlave;
749768
Master->Status = AVR_MODBUS_ReadHolding;
750769
Master->Tick_us = MasterProcTick_us;
751770
Master->Uart->ReceivingDelay = AVR_MODBUS_RECEIVING_DELAY_US / Master->Tick_us;
752771
Master->PollDelay = AVR_MODBUS_DEFAULT_POLLING_DELAY_US / Master->Tick_us;
753772
if(Master->Uart->ReceivingDelay < 2) Master->Uart->ReceivingDelay = 2;
754773

755-
Master->Bit.InitGeneral = ((Master->Uart == null) || (Master->SlaveArray == null)) ? false : true;
774+
Master->Bit.InitGeneral = true;
756775
Master->Bit.InitComplete = CheckAllOfMasterInit(Master);
757776

758777
return Master->Bit.InitGeneral;
@@ -821,26 +840,17 @@ tU8 AvrModbusMasterAddSlave(tag_AvrModbusMasterCtrl *Master, tU8 Id, enum_AvrMod
821840
{
822841
if(Master->SlaveArray[i].Id == 0)
823842
{
824-
Master->SlaveArray[i].PollData = (tag_AvrModbusMasterSlavePollData *) calloc(1, sizeof(tag_AvrModbusMasterSlavePollData));
825-
if(Master->SlaveArray[i].PollData == null)
826-
{
827-
Master->Bit.PollDataAllocFail = true;
828-
break;
829-
}
830-
else
831-
{
832-
Master->SlaveArray[i].Id = Id;
833-
Master->SlaveArray[i].NoResponseCnt = 0;
834-
Master->SlaveArray[i].NoResponseLimit = AVR_MODBUS_DEFAULT_SLAVE_NO_RESPONSE;
835-
Master->SlaveArray[i].PollDataMax = 1;
836-
Master->SlaveArray[i].PollData[0].PollFunction = PollFunction;
837-
Master->SlaveArray[i].PollData[0].StartAddr = StartAddr;
838-
Master->SlaveArray[i].PollData[0].NumberOfRegister = NumberOfRegister;
839-
Master->SlaveArray[i].PollData[0].BaseAddr = BaseAddr;
840-
Master->SlavePoll = &Master->SlaveArray[i];
841-
Master->AddedSlave++;
842-
return true;
843-
}
843+
Master->SlaveArray[i].Id = Id;
844+
Master->SlaveArray[i].NoResponseCnt = 0;
845+
Master->SlaveArray[i].NoResponseLimit = AVR_MODBUS_DEFAULT_SLAVE_NO_RESPONSE;
846+
Master->SlaveArray[i].PollDataMax = 1;
847+
Master->SlaveArray[i].PollData[0].PollFunction = PollFunction;
848+
Master->SlaveArray[i].PollData[0].StartAddr = StartAddr;
849+
Master->SlaveArray[i].PollData[0].NumberOfRegister = NumberOfRegister;
850+
Master->SlaveArray[i].PollData[0].BaseAddr = BaseAddr;
851+
Master->SlavePoll = &Master->SlaveArray[i];
852+
Master->AddedSlave++;
853+
return true;
844854
}
845855
}
846856

AvrModbus.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,15 @@
99
/*********************************************************************************/
1010
#include "AvrUart.h"
1111
/*********************************************************************************/
12-
#define AVR_MODBUS_REVISION_DATE 20201020
12+
#define AVR_MODBUS_REVISION_DATE 20210318
1313
/*********************************************************************************/
1414
/** REVISION HISTORY **/
1515
/*
16+
2021. 03. 18. - Master파트 tag_AvrModbusMasterSlavePollData는 AvrModbusMasterAddSlave(), AvrModbusMasterAddSlavePollData() 호출할 때
17+
Jeong Hyun Gu 할당 하게 되어 있는데, Master Init 시점에서 메모리 동적할당 성공여부를 확인할 수 없음.
18+
AvrModbusMasterAddSlavePollData()는 보통 잘 사용하지 않으므로 AvrModbusMasterGeneralInit() 시점에서 미리 1개의 tag_AvrModbusMasterSlavePollData를
19+
할당하여 Init시점에서 메모리 할당 성공여부 확인할 수있도록 변경.
20+
1621
2020. 10. 20. - 2020. 07. 03에서 수정한 내용 AvrModbusMasterAddSlave()에서 사용자가 설정한 PollFunction이
1722
Jeong Hyun Gu 반영되지 않고 AVR_MODBUS_ReadHolding로 설정되는 문제 수정.
1823
@@ -125,7 +130,7 @@
125130
#define false 0
126131
#define null 0
127132

128-
#define AVR_MODBUS_MASTER true
133+
#define AVR_MODBUS_MASTER false
129134
#define AVR_MODBUS_SLAVE true
130135

131136
#define AVR_MODBUS_RECEIVING_DELAY_US 20000

0 commit comments

Comments
 (0)