Commit 3290b030 authored by Pavel Vainerman's avatar Pavel Vainerman

попытка исправить подвисание в ModbusSlave

parent 0d25a1c6
......@@ -135,6 +135,8 @@ class ModbusClient
inline void setCRCNoCheckit( bool set ){ crcNoCheckit = set; }
inline bool isCRCNoCheckit(){ return crcNoCheckit; }
virtual void cleanupChannel(){}
protected:
/*! get next data block from channel ot recv buffer
......
......@@ -24,7 +24,7 @@ class ModbusRTUMaster:
ModbusRTUMaster( const std::string dev, bool use485=false, bool tr_ctl=false );
virtual ~ModbusRTUMaster();
inline void cleanupChannel(){ if( port ) port->cleanupChannel(); }
virtual void cleanupChannel(){ if( port ) port->cleanupChannel(); }
void setSpeed( ComPort::Speed s );
void setSpeed( const std::string s );
......
......@@ -33,6 +33,8 @@ class ModbusRTUSlave:
ComPort::Speed getSpeed();
virtual ModbusRTU::mbErrCode receive( ModbusRTU::ModbusAddr addr, timeout_t msecTimeout );
virtual void cleanupChannel(){ if(port) port->cleanupChannel(); }
protected:
......
......@@ -68,6 +68,8 @@ class ModbusServer
ModbusRTU::FileTransferRetMessage& reply,
DebugStream* dlog=0 );
virtual void cleanupChannel(){}
protected:
/*! Обработка запроса на чтение данных (0x01).
......
......@@ -30,6 +30,8 @@ class ModbusTCPMaster:
void reconnect();
void cleanInputStream();
virtual void cleanupChannel(){ cleanInputStream(); }
protected:
......
......@@ -27,7 +27,9 @@ class ModbusTCPServer:
inline void setIgnoreAddrMode( bool st ){ ignoreAddr = st; }
inline bool getIgnoreAddrMode(){ return ignoreAddr; }
void cleanInputStream();
virtual void cleanupChannel(){ cleanInputStream(); }
protected:
virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request );
......
......@@ -198,12 +198,12 @@ unsigned char ComPort::m_receiveByte( bool wait )
/* select' returns 0 if timeout, 1 if input available, -1 if error. */
if(select(FD_SETSIZE, &set, NULL, NULL, &timeout)==1)
bufLength=read(fd,buf,BufSize);
bufLength= ::read(fd,buf,BufSize);
else
bufLength=-1;
}
else
bufLength=read(fd,buf,BufSize);
bufLength= ::read(fd,buf,BufSize);
if(bufLength <= 0)
{
throw UniSetTypes::TimeOut();
......@@ -299,18 +299,23 @@ void ComPort::cleanupChannel()
if( fd < 0 )
return;
// PassiveTimer pt(t_msec);
int fd2 = dup(fd);
if( fd2 < 0 )
return;
fcntl(fd2,F_SETFL,O_NONBLOCK);
unsigned char tmpbuf[100];
int k = 0;
do
{
k = ::read(fd,tmpbuf,sizeof(tmpbuf));
k = ::read(fd2,tmpbuf,sizeof(tmpbuf));
}
while( k>0 );
// #warning Обнулять нельзя, может надо делать что-то интелектуальнее...
// curSym = 0;
// bufLength = 0;
close(fd2);
curSym = 0;
bufLength=-1;
}
// --------------------------------------------------------------------------------
void ComPort::setSpeed( std::string s )
......
......@@ -340,6 +340,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
{
dlog[Debug::WARN] << "(recv): " << (ModbusHeader*)(&rbuf) << endl;
dlog[Debug::WARN] << "(recv): заголовок меньше положенного..." << endl;
cleanupChannel();
return erInvalidFormat;
}
......@@ -366,6 +367,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "): Получили данных меньше чем ждали...(recv="
<< rlen << " < wait=" << rbuf.len << ")" << endl;
}
cleanupChannel();
return erInvalidFormat;
}
bcnt+=rlen;
......@@ -388,7 +391,10 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
}
if( qfunc!=rbuf.func )
{
cleanupChannel();
return erUnExpectedPacketType;
}
// Определяем тип сообщения
switch( rbuf.func )
......@@ -453,6 +459,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
break;
*/
default:
cleanupChannel();
return erUnExpectedPacketType;
}
......@@ -472,6 +479,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "): Получили данных меньше чем ждали...(recv="
<< rlen << " < wait=" << rbuf.len << ")" << endl;
}
cleanupChannel();
return erInvalidFormat;
}
......@@ -501,6 +510,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat;
}
......@@ -554,7 +564,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat;
}
......@@ -609,6 +620,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat;
}
......@@ -662,6 +674,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rlen1 << " < " << szDataLen << ")" << endl;
}
cleanupChannel();
return erInvalidFormat;
}
......@@ -844,7 +857,8 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< rbuf.func << "):(fnFileTransfer) "
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
cleanupChannel();
return erInvalidFormat;
}
......@@ -919,6 +933,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
<< "Получили данных меньше чем ждали...("
<< rlen1 << " < " << szDataLen << ")" << endl;
cleanupChannel();
return erInvalidFormat;
}
......@@ -954,6 +969,7 @@ mbErrCode ModbusClient::recv_pdu( ModbusByte qfunc, ModbusMessage& rbuf, timeout
else
{
// А как мы сюда добрались?!!!!!!
cleanupChannel();
return erUnExpectedPacketType;
}
}
......
......@@ -593,6 +593,7 @@ mbErrCode ModbusServer::recv_pdu( ModbusMessage& rbuf, timeout_t timeout )
break;
default:
cleanupChannel();
return erUnExpectedPacketType;
}
......
......@@ -224,3 +224,14 @@ mbErrCode ModbusTCPServer::pre_send_request( ModbusMessage& request )
return erNoError;
}
// -------------------------------------------------------------------------
void ModbusTCPServer::cleanInputStream()
{
unsigned char buf[100];
int ret=0;
do
{
ret = getNextData(buf,sizeof(buf));
}
while( ret > 0);
}
// -------------------------------------------------------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment