Работа с Com портами.

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Handsoff, 10 апр 2008.

  1. Handsoff

    Handsoff New Member

    Регистрация:
    10 апр 2008
    Сообщения:
    1
    Симпатии:
    0
    Помогите плиззз надо пересылать данные через COM порт с одного компа на другой... Может у когонить есть наброски? :)
     
  2. EugenOS

    EugenOS Active Member

    Регистрация:
    22 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    Если еще актуально.

    Есть несколько способов.

    Самый простой в том смысле что искать ничего не надо - открываем хелп и находим описание функции CreateFile. ( только "событий" (aka Events) не ждите. Там есть механизм, но он не сразу понятен, особенно с налета (называется OVARLAPPED режим)

    Можно поискать компоненты в инете. Мне понравилось работать c TCommThread. А по исходникам стало понятно как нормально работать с портами.
     
  3. ollleg

    ollleg Гость

    ПОМОГИТЕ, ПОЖАЛУЙСТА. Мне нужно считать строку из COM2, но я не знаю как это делать, уже целый день гуглю по интернету. Находил пример с АПИ-функциями, но он отказался работать, может дадите мне ссылочку на какойнить компонент?
     
  4. Yason

    Yason Гость

    ollleg, аську гугла дать?
     
  5. WoodooMan

    WoodooMan Гость

    пакет компонентов - cport-3.10

    а вот рабочий пример на апи:

    Код (Text):
    int OpenPort(AnsiString NumPort, int Baud) {
    DCB ComDcb;
    COMMTIMEOUTS TimeOuts;
    int ok;

    hCOM = INVALID_HANDLE_VALUE;
    memset( &ComDcb, '\0', sizeof(DCB) );

    NumPort = "\\\\.\\COM" + NumPort;
    hCOM = CreateFile(NumPort.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

    ok = hCOM != INVALID_HANDLE_VALUE;

    // "baud=115200 parity=N data=8 stop=1"
    AnsiString Param = "baud=" + IntToStr(Baud) + " parity=N data=8 stop=1";
    ok = ok && BuildCommDCB(Param.c_str(), &ComDcb );
    ComDcb.fDtrControl = DTR_CONTROL_ENABLE;
    ComDcb.fBinary = true;

    ok = ok && SetCommState( hCOM, &ComDcb );
    ok = ok && GetCommTimeouts( hCOM, &TimeOuts );
    TimeOuts.ReadTotalTimeoutMultiplier = 10;
    ok = ok && SetCommTimeouts( hCOM, &TimeOuts );

    if ( (!ok) && (hCOM != INVALID_HANDLE_VALUE) )
    return 0;
    if (hCOM == INVALID_HANDLE_VALUE)
    return 0;
    return 1;
    }

    //---------------------------------------------------------------------------
    // закрытие СОМ- порта
    void ClosePort() {
    if (hCOM != INVALID_HANDLE_VALUE) {
    CloseHandle( hCOM );
    }
    }

    //---------------------------------------------------------------------------
    // поиск свободных портов
    void FindComPort(TStrings *ComList) {
    AnsiString S;
    char name[15];
    int ok;
    DCB ComDcb;

    for (int i = 1; i <= 10; i++) {
    hCOM = INVALID_HANDLE_VALUE;
    memset( &ComDcb, '\0', sizeof(DCB) );

    ComDcb.fRtsControl = RTS_CONTROL_ENABLE;

    S = (AnsiString)i;
    strcpy(name, "\\\\.\\COM");
    strcat(name, S.c_str());

    hCOM = CreateFile( name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
    ok = hCOM != INVALID_HANDLE_VALUE;
    if (ok) {
    ComList->Add("COM" + S);
    CloseHandle( hCOM );
    }
    }
    }

    //---------------------------------------------------------------------------
    int GetFromPort(unsigned char *buf, int len) {
    DWORD rTmp;
    if (ReadFile(hCOM, buf, len, &rTmp, NULL ))
    return rTmp;
    return 0;
    }

    //---------------------------------------------------------------------------
    int Send2Port(unsigned char *SBuf, int sP, bool F) {
    DWORD sTmp;
    int WFRet;
    unsigned char Ch;
    if(F) {
    while(GetFromPort(&Ch, 1) > 0)
    Application->ProcessMessages();
    }

    WFRet = WriteFile(hCOM, SBuf, sP, &sTmp, NULL );
    return WFRet ? sTmp: 0;
    }
     
  6. ollleg

    ollleg Гость

    WoodooMan, спасибо большое
     
  7. EugenOS

    EugenOS Active Member

    Регистрация:
    22 июл 2007
    Сообщения:
    27
    Симпатии:
    0
    до чего же обленился нынешний новичек - я ввел TCommThread в нигме и вторая ссылка была на сайт автора (вернее страничку на кодегеаре)
    откуда можно скачать компонент.(вернее класс)
     
  8. ollleg

    ollleg Гость

    я не знаю что такое нигма, в гугле искал я TCommThread ничего не нашол
     
  9. Yason

    Yason Гость

    "Не знаю" = поищу.
    "Не нашёл" = плохо искал.
     
Загрузка...

Поделиться этой страницей