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)

еще зависит от устройства какие оно там задержки использует
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.