Существует задача реализации в Win2K протокола передачи данных по последовательному интерфейсу RS-485. Магистраль RS-485 содержит несколько устройств, работающих в режиме MASTER — передача прав на управление каналом осуществляется при помощи маркера. Для решения коллизий между данными от различных устройств используется эхо-контроль передаваемых данных.
Вопрос такой, возможно ли осуществить эхо-контроль на плате, работающей в режиме RS-485 (half-duplex). Желательно средствами Win32 COMM API.
Железо многопортовая плата Moxa Industio CP-114I. В руководства к ней такие вещи не описаны. Если кто-нибудь сталкивался с таким железом, или решал подобные задачи — поделитесь опытом, pls.
E>Железо многопортовая плата Moxa Industio CP-114I. В руководства к ней такие вещи не описаны. Если кто-нибудь сталкивался с таким железом, или решал подобные задачи — поделитесь опытом, pls.
Я работал по RS-485 через плату преобразователь, на сколько я помню там надо было переклбчать ногу самому
одним из сигналов, помоему rs, и не забывать глотать это самое эхо..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Здравствуйте, dad, Вы писали:
dad>Я работал по RS-485 через плату преобразователь, на сколько я помню там надо было переклбчать ногу самому dad>одним из сигналов, помоему rs, и не забывать глотать это самое эхо..
Спасибо за ответ.
В своей проблеме я пока не разобрался. Для чтения(записи) данных из(в) COM-порт я использую не блокирующие (использую OVERLAPPED) функции ReadFile(...) — WriteFile(...).
При этом прием не происходит. При использовании блокирующих функций с timout'ами работает, хотя эха — всё нет
Не хочу мучить никого своим исходником. Поэтому вопрос: Может ли быть ошибка, при использовании не блокирующих функций, быть связана с драйверами платы, или драйвера здесь не причем?
PS: Программа тестировалась на RS-232 и RS-422 — там работает.
E>В своей проблеме я пока не разобрался. Для чтения(записи) данных из(в) COM-порт я
я сейчас не очень врубаюсь, могу показать исходнички только:
давно писал уже показываю принципиальные моменнты .. работа с 485 через интерфейсную плату, !Не в OVERLAPPED режиме
а) надо выбрать уровень записи 1 или 0
int writeDirect
б) надо быбрать переклбючающий сигнал (DTR или RTS)
DTR:
signal_clr = CLRDTR;
signal_set = SETDTR;
RTS
signal_clr = CLRRTS;
signal_set = SETRTS;
в) открыть порт и запомнить параметры
_hDev = ::CreateFile( port , GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING , NULL);
if (m_hDev == INVALID_HANDLE_VALUE){
return false ;
}//
::PurgeComm(m_hDev,PURGE_TXCLEAR|PURGE_RXCLEAR);
if (! ::GetCommTimeouts(m_hDev, &oldTimeOuts) )
if (! ::GetCommState(m_hDev, &oldDCB) )
г) установить свои параметры порта:
COMMTIMEOUTS newTimeOuts;
DCB newDCB;
newDCB = oldDCB;
newDCB.BaudRate = (DWORD)param.rate.rate();
newDCB.ByteSize = 8;
newDCB.Parity = NOPARITY;
newDCB.StopBits = ONESTOPBIT;
newDCB.fErrorChar = FALSE;
newDCB.fDsrSensitivity = 0;
newDCB.fAbortOnError = FALSE;
newDCB.fOutxCtsFlow = FALSE;
newDCB.fOutxDsrFlow = FALSE;
newDCB.fOutX = FALSE;
newDCB.fInX = FALSE;
newDCB.fNull = FALSE;
if (signal_clr == CLRDTR)
{
newDCB.fRtsControl = RTS_CONTROL_DISABLE ;
newDCB.fDtrControl = DTR_CONTROL_ENABLE;
}
else
{
newDCB.fRtsControl = RTS_CONTROL_ENABLE;
newDCB.fDtrControl = DTR_CONTROL_DISABLE;
}
перейти в режим ожидания сигнала от 485
switchToWait();
д) переход в режим ожидания:
// если ты ждешь эхо (а ты должен знать его размер)bool switchToWait(const BYTE* echo, DWORD size )
{
bool result = false;
if (echo)
{
BYTE* e_answ = NULL;
if ( receivePocket(&e_answ, &size, true) )
{
if ( memcmp(echo, e_answ, size) != 0 )
{
}
else
{
result = :: EscapeCommFunction(m_hDev, writeDirect ? signal_clr : signal_set ) ? true : false;
}
}
killPocket(&e_answ);
}
else
result = :: EscapeCommFunction(m_hDev, writeDirect ? signal_clr : signal_set ) ? true : false;
}
return result;
}
д) переключение в режим отправки:
bool switchToWrite()
{
bool result = false;
result = :: EscapeCommFunction(m_hDev, writeDirect ? signal_set : signal_clr ) ? true : false;
return result;
}
е) чтение из порта
//limit а переданнео число байтbool receivePocket(BYTE** data, DWORD* size, bool limit)
{
//ну тут ничего интересного не было :)
}
ж) щзапись в порт
bool writePocket(BYTE** data)
{
if ((*data) != NULL)
{
if ( switchToWrite() )
{
//........
DWORD size = 5 + (*data)[_LO_] ;
DWORD charsWritten = 0;
if ( ::WriteFile ( m_hDev, (*data), size , &charsWritten , NULL ) )
{
::FlushFileBuffers(m_hDev);
}
if ( ! switchToWait( (*data),size) )
return false;
if ( charsWritten == size)
return true;
}
}
return false;
}
E>Не хочу мучить никого своим исходником. Поэтому вопрос: Может ли быть ошибка, при использовании не блокирующих функций, быть связана с драйверами платы, или драйвера здесь не причем?
E>PS: Программа тестировалась на RS-232 и RS-422 — там работает.
еще есть некотрые проблемы с работой по NT по быстродействию попробуй увеличить timeout (для no overlapped)
еще зависит от устройства какие оно там задержки использует
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)