Important Update:

- Added SendEnable (vir RTS pin) for TTL/RS485 converter
- Bug fix: Check for Handle->InTimeout before force output
This commit is contained in:
Charl Wentzel
2019-03-04 16:42:29 +02:00
parent 49294ab6b5
commit 3626909786
2 changed files with 30 additions and 3 deletions

View File

@@ -128,6 +128,8 @@ bool CSelectableCore::Init( CDataMember * FunctionConfig )
FlowCtrl = HW_FLOWCTRL;
else if (!strcasecmp( FlowCtrlText, "software" ))
FlowCtrl = SW_FLOWCTRL;
else if (!strcasecmp( FlowCtrlText, "rs485" ))
FlowCtrl = RS485_FLOWCTRL;
else
FlowCtrl = NO_FLOWCTRL;
@@ -652,6 +654,12 @@ THandle * CSelectableCore::OpenSerialPort( THandle * Handle )
return NULL;
}
// Set Send Enable (via RTS) for RS485
if ((Handle->Type == ctSerial) && (Handle->FlowCtrl == RS485_FLOWCTRL)) {
int sercmd = TIOCM_RTS;
ioctl( Handle->FD, TIOCMBIS, &sercmd );
}
// Log Event
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Serial Port opened [%s]",
ProcessName, Name, Handle->Name, Handle->Path );
@@ -1748,6 +1756,12 @@ bool CSelectableCore::Close( THandle * Handle, bool QuickReopen )
}
}
// Set Send Enable (via RTS) for RS485
if ((Handle->Type == ctSerial) && (Handle->FlowCtrl == RS485_FLOWCTRL)) {
int sercmd = TIOCM_RTS;
ioctl( Handle->FD, TIOCMBIC, &sercmd );
}
// Close Handle
if (Handle->Type == ctUDPremote) {
Fail = false;
@@ -2099,10 +2113,22 @@ bool CSelectableCore::Write( THandle * Handle )
{
// Write directly to handle / socket
errno = 0;
if ((Handle->Type == ctUDPclient)|| (Handle->Type == ctUDPremote)) {
if ((Handle->Type == ctUDPclient) || (Handle->Type == ctUDPremote)) {
Len = Handle->OutBuffer->Peek( &Data );
BytesWritten = WriteToUDP( Handle, Data, Len, true );
}
else if ((Handle->Type == ctSerial) && (Handle->FlowCtrl == RS485_FLOWCTRL)) {
// Set Send Enable (via RTS pin) when sending data
int sercmd = TIOCM_RTS;
ioctl( Handle->FD, TIOCMBIC, &sercmd );
usleep( 1000 );
BytesWritten = Handle->OutBuffer->WriteToFD( Handle->FD );
tcdrain( Handle->FD );
usleep( 1000 );
ioctl( Handle->FD, TIOCMBIS, &sercmd );
}
else {
BytesWritten = Handle->OutBuffer->WriteToFD( Handle->FD );
}
@@ -2163,7 +2189,7 @@ bool CSelectableCore::ProcessInputBuffer( THandle * Handle, bool Force )
}
// Check if forced processed
if (Force || !Handle->InMarkerLen)
if (Force || (!Handle->InMarkerLen && !Handle->InTimeout))
{
// Show Packet
Len = Handle->InBuffer->Peek( &Data );
@@ -2180,7 +2206,7 @@ bool CSelectableCore::ProcessInputBuffer( THandle * Handle, bool Force )
// Clear processed bytes from buffer
Handle->InBuffer->Clear( Len );
}
else
else if (Handle->InMarkerLen)
{
// Search for end of packet marker
while (Handle->InBuffer->FindStr( Handle->InMarker, Handle->InMarkerLen, Pos ))