Главная / FAQ по Builder'у / 44 Как работать с модемом...

44 Как работать с модемом через COM порт (посылать/принимать данные)?


Используй стандартные функции API:
в Builder5 работа с портом происходит аналогично работа с файлом...
 DCB           m_dcb;
 HANDLE        m_hCom;// handle to the comm port.
// Параметры инициализации по умолчанию
    m_dcb.DCBlength = sizeof(DCB);
    m_dcb.BaudRate  =9600;
    m_dcb.ByteSize  =8;
    m_dcb.Parity    =NOPARITY;    //NOPARITY and friends are #defined in 
                                  //windows.h
    m_dcb.StopBits  =ONESTOPBIT;  //ONESTOPBIT is also from windows.h

// Работа с портом происходит аналогично работе с файлом
    m_hCom = CreateFile(m_CommPort.c_str(),
                        GENERIC_READ | GENERIC_WRITE,
                        0,    /* comm devices must be opened w/exclusive-access */
                        NULL, /* no security attrs */
                        OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
                        0,    /* not overlapped I/O */
                        NULL  /* hTemplate must be NULL for comm devices */
                        );
// Если файл не открыть:
// 1. Порт уже открыт
// 2. Порт не существует
    if(m_hCom == INVALID_HANDLE_VALUE)
        //throw ECommError(ECommError::OPEN_ERROR);
     {
     Application->MessageBoxA("Порт 1(или он не существует) открыт, закройте его
и перезапустите программу","Внимание",MB_OK); Application->Terminate(); return; } // получаем структуру DCB порта, который мы открыли if(!GetCommState(m_hCom,&m_dcb)) { CloseHandle(m_hCom); throw ECommError(ECommError::GETCOMMSTATE); } // Теперь копируем наши параметры в структуру DCB порта m_dcb.BaudRate = tempDCB.BaudRate; m_dcb.ByteSize = tempDCB.ByteSize; m_dcb.Parity = tempDCB.Parity; m_dcb.StopBits = tempDCB.StopBits; // устанавливаем наши параметры if(!SetCommState(m_hCom,&m_dcb)) { CloseHandle(m_hCom); throw ECommError(ECommError::SETCOMMSTATE); } // устанавливаем размер буферов приема и передачи if(!SetupComm(m_hCom, 1024*32, 1024*9)) { CloseHandle(m_hCom); throw ECommError(ECommError::SETUPCOMM); }
И усе. Теперь работаем как с файлом
Посылка:
// записываем в буфер передачи и сразу отправляем
    VerifyOpen();
    DWORD dummy;
    BYTE *ptr = buffer;

    for (unsigned int j=0; j
        // Ожидаем когда байт будет послан
        FlushCommPort();
        ++ptr;
    }
Прием:
// чтение буфера приема
int ReadBytes(BYTE *buffer, unsigned int MaxBytes)
{
    VerifyOpen();
    DWORD bytes_read;


    if(!ReadFile(m_hCom,buffer,MaxBytes,&bytes_read,NULL))
        throw ECommError(ECommError::READ_ERROR);

// Если кол-во считанных байт больше чем нужно
    if(bytes_read < MaxBytes)
        buffer[bytes_read]='\0';

    return bytes_read;
}
Igor Korataev

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz