Эхо-контроль COM-порта (RS-485)
От: Elric  
Дата: 19.11.03 12:11
Оценка:
Приветствую, Всех!

Существует задача реализации в Win2K протокола передачи данных по последовательному интерфейсу RS-485. Магистраль RS-485 содержит несколько устройств, работающих в режиме MASTER — передача прав на управление каналом осуществляется при помощи маркера. Для решения коллизий между данными от различных устройств используется эхо-контроль передаваемых данных.

Вопрос такой, возможно ли осуществить эхо-контроль на плате, работающей в режиме RS-485 (half-duplex). Желательно средствами Win32 COMM API.

Железо многопортовая плата Moxa Industio CP-114I. В руководства к ней такие вещи не описаны. Если кто-нибудь сталкивался с таким железом, или решал подобные задачи — поделитесь опытом, pls.

С уважением, Elric.
Re: Эхо-контроль COM-порта (RS-485)
От: dad  
Дата: 19.11.03 13:19
Оценка:
E>Железо многопортовая плата Moxa Industio CP-114I. В руководства к ней такие вещи не описаны. Если кто-нибудь сталкивался с таким железом, или решал подобные задачи — поделитесь опытом, pls.

Я работал по RS-485 через плату преобразователь, на сколько я помню там надо было переклбчать ногу самому
одним из сигналов, помоему rs, и не забывать глотать это самое эхо..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[2]: Эхо-контроль COM-порта (RS-485)
От: Elric  
Дата: 21.11.03 13:49
Оценка:
Здравствуйте, dad, Вы писали:

dad>Я работал по RS-485 через плату преобразователь, на сколько я помню там надо было переклбчать ногу самому

dad>одним из сигналов, помоему rs, и не забывать глотать это самое эхо..

Спасибо за ответ.

В своей проблеме я пока не разобрался. Для чтения(записи) данных из(в) COM-порт я использую не блокирующие (использую OVERLAPPED) функции ReadFile(...) — WriteFile(...).
При этом прием не происходит. При использовании блокирующих функций с timout'ами работает, хотя эха — всё нет

Не хочу мучить никого своим исходником. Поэтому вопрос: Может ли быть ошибка, при использовании не блокирующих функций, быть связана с драйверами платы, или драйвера здесь не причем?

PS: Программа тестировалась на RS-232 и RS-422 — там работает.

С уважением, Elric.
Re[3]: Эхо-контроль COM-порта (RS-485)
От: dad  
Дата: 21.11.03 14:19
Оценка:
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)

еще зависит от устройства какие оно там задержки использует
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re[4]: Эхо-контроль COM-порта (RS-485)
От: Elric  
Дата: 22.11.03 14:19
Оценка:
Здравствуйте, dad, Вы писали:

dad> давно писал уже показываю принципиальные моменнты .. работа с 485 через интерфейсную плату, !Не в OVERLAPPED режиме


{ ... }

Спасибо за пример. Буду разбираться.

С уважением,
Elric.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.