Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Borland C++ Builder & Kylix _ Работа с Com портами.

Автор: Handsoff 10:04:2008, 09:05

Помогите плиззз надо пересылать данные через COM порт с одного компа на другой... Может у когонить есть наброски? unsure.gif

Автор: Yason 16:04:2008, 20:21

Handsoff
http://www.google.com/search?hl=ru&q=c%2B%2Bbuilder+com+port&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr= rolleyes.gif

Автор: EugenOS 5:05:2008, 15:43

Если еще актуально.

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

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

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

Автор: ollleg 24:06:2008, 20:30

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

Автор: Yason 24:06:2008, 22:40

Цитата(ollleg @ 25:06:2008 - 00:30) *
может дадите мне ссылочку на какойнить компонент?

Цитата(EugenOS @ 5:05:2008 - 19:43) *
Можно поискать компоненты в инете. Мне понравилось работать c TCommThread.

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

Автор: WoodooMan 25:06:2008, 05:40

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

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

Код
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;
}

Автор: ollleg 25:06:2008, 14:14

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


Автор: EugenOS 25:06:2008, 19:37

до чего же обленился нынешний новичек - я ввел TCommThread в нигме и вторая ссылка была на сайт автора (вернее страничку на кодегеаре)
откуда можно скачать компонент.(вернее класс)

Автор: ollleg 26:06:2008, 19:08

Цитата
я ввел TCommThread в нигме и вторая ссылка была на сайт автора (вернее страничку на кодегеаре)

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

Автор: Yason 27:06:2008, 06:39

Цитата(ollleg @ 26:06:2008 - 23:08) *
я не знаю что такое нигма, в гугле искал я TCommThread ничего не нашол

"Не знаю" = http://www.google.it/search?hl=en&q=%D0%BD%D0%B8%D0%B3%D0%BC%D0%B0&btnG=Google+Search&meta=.
"Не нашёл" = http://www.google.it/search?hl=ru&safe=off&q=TCommThread&btnG=Search&meta=.

Русская версия Invision Power Board (http://www.nulled.ws)
© Invision Power Services (http://www.nulled.ws)