Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Получение сообщения от аппаратуры  (Прочитано 22444 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ysv_
Гость
« : 24-09-2003 09:43 » 

Нужно к моей программе аудиозаписи (под Windows 95/98/2K) добавить возможность запускать запись при вкл. некоего устройства и останавливать запись при выкл. этого же устройства. Вопрос: какой порт (LPT, COM) лучше использовать для подкл. устройства и каким образом получать сообщение о получение сигнала.
На ДОС я использовал LPT и прерывание о готовности данных. А вот на Винде не знаю как подступится  Жаль

Сергей Яковин
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 24-09-2003 09:49 » 

Может лучше написать драйвер устройства и посодить его на USB???

Если говорить о простоте то тогда СОМ порт проще и событие о приходе данных можно отследить так:

Создать поток CreateThread()
Поставить его ждать на функции WaitCommEvent - после чего начинать собирать данные с потока и передавать обработчику...
Записан

А птичку нашу прошу не обижать!!!
ysv_
Гость
« Ответ #2 : 24-09-2003 14:40 » 

К сожалению не использовал СОМ-порт, поэтому вопрос: можно ли просто используя 2-3 проводка и выставляя сигнал "0" или "1" (логический) получить от Винды уведомление. И собственное какое(ие) из перечисленных в MSDN по WaitCommEvent я получу. Не нужно ли предварительно инициализировать режим работы порта и, если нужно, то каким образом?
Очень благодарен за предыдущий ответ. Понятно хотя бы направление поиска.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 24-09-2003 17:13 » 

Цитата

И собственное какое(ие) из перечисленных в MSDN по WaitCommEvent я получу.

Собственно какое запросите с помощью SetCommEvent Улыбаюсь

Цитата

Не нужно ли предварительно инициализировать режим работы порта и, если нужно, то каким образом?


Скачайте faq с сайта там была такая тема инициализации COM порта - если не удастся найти сброшу еще раз...

Насчет 2-3 проводка - если соедените сигналы даты то получить сможете сообщение о прибытии символа.

А сели поставите на другие пины в порту получите другие сигналы - все на выбор.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 24-09-2003 17:15 » 

Можно изменять уровень на каком-либо входящем сигнале СОМ-порта.
Напр.: программно установить RTS=1 и DTR=0, а CTS подключать то к одномуб то к другому. UART детектит изменения сигналов. А вот как это событие получить в вин - это уже не ко мне.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ysv_
Гость
« Ответ #5 : 25-09-2003 12:23 » 

Цитата

Скачайте faq с сайта там была такая тема инициализации COM порта - если не удастся найти сброшу еще раз...

faq скачал. Темы не нашел  Жаль
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 25-09-2003 12:43 » 

Пины под виной ставить можно, только 2:

::EscapeCommFunction(m_hPort, SETDTR); ставит 4 пин в "1"
::EscapeCommFunction(m_hPort, CLRDTR); в "0"

::EscapeCommFunction(m_hPort, SETRTS); ставит 7 пин в "1"
::EscapeCommFunction(m_hPort, CLRRTS); в "0"

опрос:

bool GetPortPin(int nPin)
{
   if (nPin <= 9)
   {
      static DWORD dwPins[10] = {0,MS_RLSD_ON,0,0,0,0,MS_DSR_ON,0,MS_CTS_ON,MS_RING_ON};
      DWORD dwModemStat = 0;
      if ( ::GetCommModemStatus(m_hPort, &dwModemStat)  )
      {
         return ((dwPins[nPin] & dwModemStat) != 0);
      }
   }

   return false;
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #7 : 25-09-2003 12:55 » 

Джон, Можне еще и TX'ом управлять
EscapeCommFunction(hport, SETBREAK)
EscapeCommFunction(hport, CLRBREAK)

А больше проводов на выход в RS232 нету Улыбаюсь

А отслеживать изменения можно как уже Гром написал с помощью WaitCommEvent(). Чего именно ждать определяет SetCommMask()
Для тебя могут быть интересны EV_DSR, EV_CTS, EV_BREAK и EV_RING
соответственно изменение DSR, CTS, наличие BREAK условия на линии RX и RI стал активным.
Записан

Megabyte be with you!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 25-09-2003 13:19 » 

Точно, про BREAK забыл
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 25-09-2003 15:41 » 

Джон, а тут не надо управлять а надо сообщения ловить а эвенты есть для этого - и менять состояние пина как я понял - тоже будет устройство а не программа, программа будет реагировать.

ИМХО вполне подойдет реакция на любой пин 1 или 2 по описанию WaitCommEvent.
А распайка СОМ порта достаточно известная штука.

ysv_, тогда выложу полную инициализацию порта сейчас.
Записан

А птичку нашу прошу не обижать!!!
ysv_
Помогающий

ua
Offline Offline

« Ответ #10 : 25-09-2003 21:16 » 

Цитата

ysv_, тогда выложу полную инициализацию порта сейчас.

И где ее искать???
Кстати я попытался сделать, что-то работающее, но оно радосно сообщает сначала, что IO_PENDING_ERROR, а потом что Event сработал, хотя я ничего еще со входами не делал. Код привожу:
      return 3;
  }

  if (!EscapeCommFunction(hCom, CLRDTR) && !EscapeCommFunction(hCom, SETRTS))
  {
      MessageBox(NULL, "Not connected", "TreadFunc", MB_OK);
      return 4;
  }

  MessageBox(NULL, toString(hCom), "ThreadFunc", MB_OK);
  MessageBox(NULL, "Before WaitCommEvent", "ThreadFunc", MB_OK);
// до этого доходит без проблем
  if (WaitCommEvent(hCom, &dwEvtMask, &o))
  {
    if (dwEvtMask & EV_DSR)
    {
         // To do.
      MessageBox(NULL, "GET EV_DSR", "ThreadFunc", MB_OK);
    }

    if (dwEvtMask & EV_CTS)
    {
         // To do.
      MessageBox(NULL, "GET EV_CTS", "ThreadFunc", MB_OK);
    }
    if (dwEvtMask & EV_BREAK)
    {
         // To do.
      MessageBox(NULL, "GET EV_BREAK", "ThreadFunc", MB_OK);
    }
    if (dwEvtMask & EV_RING)
    {
         // To do.
      MessageBox(NULL, "GET EV_RING", "ThreadFunc", MB_OK);
    }
  }
  else
  {
// всегда попадаем сюда
    MessageBox(NULL, "WaitCommEvent Error", "ThreadFunc", MB_OK);
    int n=GetLastError();
    if (n==997) n=WaitForSingleObject(o.hEvent, INFINITE);
// и сюда ----------------------------v
    if (n==WAIT_OBJECT_0) MessageBox(NULL, "obj_0", "ThreadFunc", MB_OK);
    char s[100]; sprintf(s, "WaitCommEvent Error: %d", n);
    MessageBox(NULL, s, "ThreadFunc", MB_OK);
    return 5;
  }
  MessageBox(NULL, "After WaitCommEvent", "ThreadFunc", MB_OK);
  return 0;
}
 
int main()
{
    DWORD dwThreadId, dwThrdParam = 1;
    HANDLE hThread;
    char szMsg[80];

    hThread = CreateThread(
        NULL,                        // default security attributes
        0,                           // use default stack size  
        ThreadFunc,                  // thread function
        &dwThrdParam,                // argument to thread function
        0,                           // use default creation flags
        &dwThreadId);                // returns the thread identifier
 
   // Check the return value for success.
 
   if (hThread == NULL)
   {
      wsprintf( szMsg, "CreateThread failed." );
      MessageBox( NULL, szMsg, "main", MB_OK );
   }
   else
   {
//      _getch();
      MessageBox( NULL, "Wait", "main", MB_OK );
      CloseHandle( hThread );
   }
   return 0;
}
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #11 : 25-09-2003 21:18 » 

Сорри, пропусти начало:

#include <windows.h>
#include <conio.h>

int GetPortPin(HANDLE h, int nPin)
{
  if (nPin<=9)
  {
    static DWORD dwPins[10] =
    {0,MS_RLSD_ON,0,0,0,0,MS_DSR_ON,0,MS_CTS_ON,MS_RING_ON};
    DWORD dwModemStat = 0;
    if (GetCommModemStatus(h, &dwModemStat) )
    {
      return ((dwPins[nPin] & dwModemStat) != 0 ? 1:0);
    }
  }
  return 0;
}

const char * toString(HANDLE h)
{
  static char s[11]; int i;
  for (i=1; i<=9; ++i)
  {
    s[i-1]='0'+GetPortPin(h, i);
  }
  return s;
}


DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
/*    char szMsg[80];

    wsprintf( szMsg, "Parameter = %d.", *(DWORD*)lpParam );
    MessageBox( NULL, szMsg, "ThreadFunc", MB_OK );

    return 0; */
  HANDLE hCom;
  OVERLAPPED o;
  BOOL fSuccess;
  DWORD dwEvtMask;

  hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,    // exclusive access
    NULL, // no security attributes
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
    );

  if (hCom == INVALID_HANDLE_VALUE)
  {
      // Handle the error.
      MessageBox(NULL, "INVALID_HANDLE_VALUE", "ThreadFunc", MB_OK);
      return 1;
  }

// Set the event mask.

  fSuccess = SetCommMask(hCom, 0); //EV_CTS | EV_DSR | EV_BREAK | EV_RING);

  if (!fSuccess)
  {
    // Handle the error.
      MessageBox(NULL, "!fSuccess", "ThreadFunc", MB_OK);
      return 2;
  }

// Create an event object for use in WaitCommEvent.

  o.hEvent = CreateEvent(
      NULL,   // no security attributes
      FALSE,  // auto reset event
      FALSE,  // not signaled
      NULL    // no name
      );

  if (!o.hEvent)
  {
      MessageBox(NULL, "!o.hEvent", "ThreadFunc", MB_OK);
      return 3;
  }
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 26-09-2003 08:34 » 

Значица так,

во-первых извиняюсь, за то, что ввёл в заблуждение с EscapeCommFunction, но думаю, что доп. инфа особенно начинающему не навредит, тем паче, что по теме. Например с помощью модемного кабеля и второго компука он сможет, проверить, как его прога работает.

во-вторых - вторая функция опрашивает пины - какие можно опросить.

и в-третьих, IMHO так всё-таки проще:

1. m_hPort = CreateFile( "\\\\.\\COM1",
                     GENERIC_READ | GENERIC_WRITE,
                     0,
                     NULL,
                     OPEN_EXISTING,
                     0,
                     NULL
                     );

2. Создаём thread с циклом в котором опрашиваем необходимые пины.
while(WaitForSingleObject(hThreadDownEvent, 5) != WAIT_TIMEOUT))
{
    if(GetPortPin(nWaitingFor))
   {
        // реакция на событие
   }
}

кстати,   if (nPin <= 9) - для 9ти пинового разъёма. Для 25 надо соответственно изменить. А так-же static DWORD dwPins[10]


настройки порта можно использовать по-умолчанию, тк речь идёт не о передаче данных, а о проверке сигнала(ов). Если использовать шину данных, то надо сразу думать о каком-нибудь протоколе.

Хотя, конечно можно и WaitCommEvent использовать. Я ничего не имею против!
Кесарю - кесарево, слесарю - слесарево.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #13 : 26-09-2003 08:48 » 

ysv_, Чего-то ты наворотил.
по моим представлениям програма должа выглядеть как-нить вот так:

Код:

    HANDLE hport;
    DWORD dwMask;

    hport = CreateFile)_T)"COM1":, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL:;

    SetCommMask)hport, EV_CTS:; // ждем изменения CTS

    WaitCommEvent)hport, &dwMask, NULL:;
    if )dwMask & EV_CTS:|
        // do what you want/
    "


Это примерно так должно выглядеть. Сюда нужно добавить проверку ошибок и хорошо бы разделить это на несколько потоков, но это уже не принципиально в данном топике.
Записан

Megabyte be with you!
ysv_
Помогающий

ua
Offline Offline

« Ответ #14 : 26-09-2003 11:52 » 

Наконец код заработал!!! Отлично
Окончательная версия:

#include <windows.h>

DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
  HANDLE hCom;
  BOOL fSuccess;
  DWORD dwEvtMask;

  hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,    // exclusive access
    NULL, // no security attributes
    OPEN_EXISTING,
    0, //FILE_FLAG_OVERLAPPED,
    NULL
    );

  if (hCom == INVALID_HANDLE_VALUE)
  {
      // Handle the error.
      MessageBox(NULL, "INVALID_HANDLE_VALUE", "ThreadFunc", MB_OK);
      return 1;
  }

  fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR | EV_BREAK | EV_RING);
  if (!fSuccess)
  {
    // Handle the error.
      MessageBox(NULL, "!fSuccess", "ThreadFunc", MB_OK);
      return 2;
  }

  MessageBox(NULL, "Before WaitCommEvent", "ThreadFunc", MB_OK);
  if (WaitCommEvent(hCom, &dwEvtMask, NULL))
  {
    if (dwEvtMask & EV_DSR)
    {
      MessageBox(NULL, "GET EV_DSR", "ThreadFunc", MB_OK);
    }

    if (dwEvtMask & EV_CTS)
    {
      MessageBox(NULL, "GET EV_CTS", "ThreadFunc", MB_OK);
    }
    if (dwEvtMask & EV_BREAK)
    {
      MessageBox(NULL, "GET EV_BREAK", "ThreadFunc", MB_OK);
    }
    if (dwEvtMask & EV_RING)
    {
      MessageBox(NULL, "GET EV_RING", "ThreadFunc", MB_OK);
    }
  }
  else
  {
    MessageBox(NULL, "WaitCommEvent Error", "ThreadFunc", MB_OK);
    return 5;
  }
  MessageBox(NULL, "After WaitCommEvent", "ThreadFunc", MB_OK);
  return 0;
}
 
int main()
{
    DWORD dwThreadId, dwThrdParam = 1;
    HANDLE hThread;
    char szMsg[80];

    hThread = CreateThread(
        NULL,                        // default security attributes
        0,                           // use default stack size  
        ThreadFunc,                  // thread function
        &dwThrdParam,                // argument to thread function
        0,                           // use default creation flags
        &dwThreadId);                // returns the thread identifier
 
   // Check the return value for success.
 
   if (hThread == NULL)
   {
      wsprintf( szMsg, "CreateThread failed." );
      MessageBox( NULL, szMsg, "main", MB_OK );
   }
   else
   {
      MessageBox( NULL, "Wait", "main", MB_OK );
      CloseHandle( hThread );
   }
   return 0;
}

Причина неправильной работы программы была в использовании OVERLAPPED при открытии порта. Сам пример я взял из MSDN'а. Но он почемуто не заработал. А вот Джон дал отличную идею - не использовать OVERLAPPED.

Хотелось бы выразить огромную !!! благодарность Грому и Джону.
заслуживают еще плюсов в репутацию. :!:
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 26-09-2003 13:12 » 

Спасибо. Рад, что у тебя получилось. Может вот ещё, рекомендация - ты используешь MessageBox() для вывода сообщений отладки. Воспользуйся лучше дебуггером - функция:

WINBASEAPI VOID WINAPI OutputDebugString (LPCSTR lpOutputString )

для твоего примера:
 if ( dwEvtMask & EV_DSR)
{
      OutputDebugString("GET EV_DSR\n");
}
...

так отладка идёт динамичней.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #16 : 26-09-2003 19:52 » 

ysv_, извини ради бога, я совсем замотался и пропустил эту тему Жаль

Я сильно извиняюсь ты все сделал правильно в конце концов!!!
Записан

А птичку нашу прошу не обижать!!!
ysv_
Помогающий

ua
Offline Offline

« Ответ #17 : 12-10-2003 21:21 » 

Все было хорошо пока не возникла необходимость в запуске программы на Windows ME. Программа не работает Жаль. Проверил на 98 - тоже не работает. На W2K - без проблем. Причем проверял даже на одном компютере. Впечатление - WaitCommEvent - не реагирует на события под Win9x. Может кто-то сталкивался с такой проблемой и знает как ее обойти. Пока ищу чего-нибудь на эту тему в Интернете.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #18 : 13-10-2003 07:35 » 

Все должно работать - тут уже была такая тема - надо поискать....
Записан

А птичку нашу прошу не обижать!!!
ysv_
Помогающий

ua
Offline Offline

« Ответ #19 : 13-10-2003 21:56 » 

Вторую ночь сижу в Интренете и ничего найти не могу. Жаль
Цитата: Гром
Все должно работать - тут уже была такая тема - надо поискать....

Здесь тоже не нашел Жаль (искал и по WaitCommEvent и по COM1)
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #20 : 14-10-2003 08:06 » 

Дело в том, что аппартура и подача сигналов не зависят от системы ОС.
СОМ порт работает и работает всегда одинаково.
Вопрос - в окончательном варианте я вижу строку
Код:

SetCommMask)hCom, EV_CTS | EV_DSR | EV_BREAK | EV_RING:;

Вопрос RX_CHAR проверял??
Дло в том, что для работы остальных сигналов надо выставлять параметры СОМ порта Parity в которых по умолчанию стоят Null в 98.
А именно этот параметр порта влият на наличие сигналов DTS и т.п.
Выставление таких параметров происходит с помощью SetCommmState.

Вот код - лежит в FAQ на сайте, в архиве старого форума:

Код:

extern HANDLE hPort;
hPort=CreateFile)"COM1",
GENERIC_READ | GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
0,
NULL:;
if )hPort == INVALID_HANDLE_VALUE: return 1;

else return 0;


DCB PortSetControl;
COMMTIMEOUTS CommTimeouts;


PortSetControl.DCBlength = sizeof )DCB:;
GetCommState)hPort,&PortSetControl:;
//Set data
PortSetControl.BaudRate=CBR_19200;
PortSetControl.Parity=NOPARITY;
PortSetControl.ByteSize=8;
PortSetControl.StopBits=ONESTOPBIT;
PortSetControl.fBinary = TRUE; // Binary mode; no EOF check
PortSetControl.fParity = TRUE; // Enable parity checking
PortSetControl.fOutxCtsFlow = FALSE; // CTS output flow control off
PortSetControl.fOutxDsrFlow = FALSE; // DSR output flow control off
PortSetControl.fDtrControl = DTR_CONTROL_DISABLE;
// DTR flow control off
PortSetControl.fDsrSensitivity = FALSE; // DSR sensitivity
PortSetControl.fTXContinueOnXoff = TRUE; // XOFF continues Tx
PortSetControl.fOutX = FALSE; // No XON/XOFF out flow control
PortSetControl.fInX = FALSE; // No XON/XOFF in flow control
PortSetControl.fErrorChar = FALSE; // Disable error replacement
PortSetControl.fNull = FALSE; // Disable null stripping
PortSetControl.fRtsControl = RTS_CONTROL_DISABLE;
// RTS flow control off
PortSetControl.fAbortOnError = FALSE; // Do not abort reads/writes on
//Set to port
SetCommState)hPort,&PortSetControl:;
//Settings for timeouts
GetCommTimeouts)hPort, &CommTimeouts:;
//Set data
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 0;
//Set to port
SetCommTimeouts)hPort, &CommTimeouts:;



Вот на эти параметры обрати внимание....
Код:

PortSetControl.fParity = TRUE; // Enable parity checking
PortSetControl.fOutxCtsFlow = FALSE; // CTS output flow control off
PortSetControl.fOutxDsrFlow = FALSE; // DSR output flow control off
PortSetControl.fDtrControl = DTR_CONTROL_DISABLE;
// DTR flow control off
PortSetControl.fDsrSensitivity = FALSE; // DSR sensitivity
PortSetControl.fTXContinueOnXoff = TRUE; // XOFF continues Tx
PortSetControl.fOutX = FALSE; // No XON/XOFF out flow control
PortSetControl.fInX = FALSE; // No XON/XOFF in flow control
PortSetControl.fErrorChar = FALSE; // Disable error replacement
PortSetControl.fNull = FALSE; // Disable null stripping
PortSetControl.fRtsControl = RTS_CONTROL_DISABLE;
// RTS flow control off

Записан

А птичку нашу прошу не обижать!!!
ysv_
Помогающий

ua
Offline Offline

« Ответ #21 : 14-10-2003 13:15 » 

Итак решение - элементарнейшее, но неожиданное!!! Под Win9x перед вызовом WaitCommEvent нужно обязательно проинициализировать COM-порт вызовом GetCommState(); SetCommState().
Вырезка из текста программы:
====================================
GetCommState(hCom, &state);  //добавлено
SetCommState(hCom, &state);  //добавлено
if (WaitCommEvent(hCom, &dwEvtMask, NULL))
====================================
Самое поразительное - я ничего в настройках то не меняю.
Такой вот глюк (или фича) Быть такого не может
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #22 : 14-10-2003 14:16 » new

ysv_, здорово - не сталкивался с таким - видимо инициализируются стейты состояний..
ИМХО глюк..
Спсибо за информацию...
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines