<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686511</guid>
        <pubDate>Mon, 18 Apr 2005 11:25:56 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686511</link>
        <description><![CDATA[emp: спасибо, ViGOur<br>
Эту статью я читал несколько раз и изначально следовал ей... там все классно написано, но к своему обмену я не могу ее применить почему-то...<br>
вот после этого и стал искать помощи на этом форуме<br>
<br>
щас я в очередной раз изменил свой код, вроде все работает и в принципе можно оставить все как есть, но если б кто-нибудь смог бы мне объяснить некоторые моменты не в стиле <strong class='tag-b'>Ace</strong>, а более по-человечески, то я бы мигом привел бы очередной код здесь с комментариями в неясных мне момента.<br>
<br>
а синхронный обмен, с которым у меня нет проблем, мне ТОЧНО не подходит, а жаль...   :(<br>
<br>
но разобраться мне очень надо. Из всех моих знакомых-программистов в миру, а не в нете, никто не занимается портами так что вживую и спросить не у кого]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686436</guid>
        <pubDate>Mon, 18 Apr 2005 10:27:57 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686436</link>
        <description><![CDATA[ViGOur: Думаю будет интересно почитать, смотри аттач...]]></description>
        <author>ViGOur</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686178</guid>
        <pubDate>Mon, 18 Apr 2005 07:42:46 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686178</link>
        <description><![CDATA[emp: почему нету монстров в етом вопросе ?  :(]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686040</guid>
        <pubDate>Mon, 18 Apr 2005 05:50:56 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=686040</link>
        <description><![CDATA[emp: мдя... для всех это такая тяжелая тема?<br>
<br>
ну спасибки всем за помощь&#33; <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2005-04-18T06:01:22+00:00">18.04.05, 06:01</time></span></span><br>
а может есть кто продвинутый, кто может подсказать как исправить мой код, а не советовать &quot;поищи в инете&quot; или &quot;ты в этом ничего не понимаешь, даже не берись за это&quot;... а я хочу понимать&#33; и мне надо разобраться<br>
<br>
жду советов...]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684170</guid>
        <pubDate>Fri, 15 Apr 2005 13:38:41 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684170</link>
        <description><![CDATA[AlexSm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=91173&view=findpost&p=684140'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>emp &#064; <time class="tag-quote__quoted-time" datetime="2005-04-15T13:14:30+00:00">15.04.05, 13:14</time></span><div class='quote '>я  бы топик не создавал если бы тчо то нашел <br>
да и кроме того я вижу что ты тоже не совсем понимаешь... не буду комментррировать что именно</div></div><br>
Ооо...Вон оно как...Уж прости, что отнял у тебя драгоценное время. Больше тут писАть не буду.  :huh:]]></description>
        <author>AlexSm</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684140</guid>
        <pubDate>Fri, 15 Apr 2005 13:14:30 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684140</link>
        <description><![CDATA[emp: я  бы топик не создавал если бы тчо то нашел <br>да и кроме того я вижу что ты тоже не совсем понимаешь... не буду комментррировать что именно<br><br><br>топик не закрываю&#33;<br>жду предложений еще <br>народ поднапрягите умы &#33;&#33; :)]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684066</guid>
        <pubDate>Fri, 15 Apr 2005 12:11:19 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684066</link>
        <description><![CDATA[AlexSm: 1) Всёж таймауты надоб так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">tm.ReadTotalTimeoutConstant = 500; // Таймаут в мс на чтение по ReadFile</div><div class="code_line">tm.ReadIntervalTimeout = MAXDWORD; // Между байтами может быть какой угодно интервал</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Ты вроде 500 мс хотел...<br>
<br>
2) После успешного WriteFile (без ухода в состояние IO_PENDING) у тебя будет диалог с ошибкой  :D <br>
3) Перепутал WAIT_OBJECT_0 и WAIT_TIMEOUT. WAIT_OBJECT_0 -&gt; Произошло событие на указанном хэндле<br>
4) &amp;dataFromPort - амперсанд тут зачем?<br>
5) То, что ReadFile с параметром оверлаппеда вернула FALSE - ещё не значит что произошла уж такая критичная ошибка. Нада проверить на ERROR_IO_PENDING<br>
<br>
ЗЫ. После основного вызова асинх. операции проверяй что ты действительно попал в состояние IO_PENDING.<br>
И далее можешь делать либо синхронно:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">BOOL fOK = GetOverlappedResult(...., TRUE);</div><div class="code_line">или</div><div class="code_line">BOOL fOK = WaitForSingleObject(..., timeout) == WAIT_OBJECT_0;</div></ol></div></div></div></div><br>
либо асинхронно:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">BOOL fOK;</div><div class="code_line">while( !(fOK = GetOverlappedResult(..., FALSE)) &amp;&amp; GetLastError() == ERROR_IO_INCOMPLETE)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; ; // что-то делаешь ещё.</div><div class="code_line">}</div><div class="code_line">или</div><div class="code_line">DWORD dwWaitCode;</div><div class="code_line">while( (dwWaitCode = WaitForSingleObject( ..., 5 /* ждать по 5 мс */)) == WAIT_TIMEOUT)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; ; // что-то делаешь ещё</div><div class="code_line">}</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2005-04-15T12:13:52+00:00">15.04.05, 12:13</time></span></span><br>
ЗЫЗЫ. И воспользуйся поиском по совету SVK. Тем дофига было о работе с ком-портами.Может чего интересного подчерпнёшь...]]></description>
        <author>AlexSm</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684041</guid>
        <pubDate>Fri, 15 Apr 2005 11:50:48 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684041</link>
        <description><![CDATA[emp: сделаю небольшие пояснения для чего мне это все надо:<br><br>1. во-первых, я хочу разобраться с асинхронным вводом-выводом<br>2. во-вторых, программа будет работать следующим образом:<br>до завершения работы программы будет крутиться в отдельном потоке вышеприведенный код и по расшифрованным принятым данным (они будут отображаться на далоге) пользователем будут приниматься те или иные действия, в число которых будет приостанавливаться этот постоянный цикл опроса девайса.<br>3. да и в-третьх, почму асинхронный?  да потому, что каждый раз ожидая ответа от девайса я не знаю сколько данных придет (от 12 до 245 байт - в этих пределах)<br><br>еще раз прошу, лучше помогите разобраться с асинхронным вводом/выводом раз и навсегда :)<br>этому желанию и служит же данный форум, правда ?]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684015</guid>
        <pubDate>Fri, 15 Apr 2005 11:30:29 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=684015</link>
        <description><![CDATA[AlexSm: <strong class='tag-b'>olddiller</strong>: Да, c режимом эвента я переборщил  :lol: <br>
<br>
<strong class='tag-b'>emp</strong>: Я тебя пытался подтолкнуть к мысле, что по предоставленному тобой коду, тут вполне мона обойтись без асинхронной возможности работы через оверлаппед интерфейс (тем более если ты не до конца понимаешь как оно работает). У тебя шаги выполняются последовательно, и никаких дополнительных действий (помимо работы с портом) ты не предпринимаешь (реакция прекращения работы потока/приложения/etc). Ну дык и зачем использовать оверлаппед? Сделай проще, синхронно:<br>
1) Открыть порт без оверлаппед<br>
2) Настроить таймауты с учетом цитаты из мсдн, что я приводил выше<br>
3) Вызвать синхронный WriteFile<br>
4) В случае успеха вызвать ReadFile<br>
5) После ReadFile имеешь либо нормальный ответ, либо ошибку чтения. Причины уже отдельно определяешь...<br>
6) Закрываешь порт<br>
<br>
В случае, если считывать нада порциями, либо нада по самим данным определять конец посылки - в шаги 4-5 вставляешь обработку этого. Возможно по ClearCommError/WaitCommEvent/etc.]]></description>
        <author>AlexSm</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683999</guid>
        <pubDate>Fri, 15 Apr 2005 11:19:07 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683999</link>
        <description><![CDATA[emp: 2AlexSm: В прошлом своем посте я погорячился раньше времени, сорри за это.<br>
<br>
товарищи я проанализировал все ваши советы и вот к чему пришел (насколько это правильно с вашей точки зрения и чего не хватает мне?). Хто возьмется проверить код и подсказать исчо чего нить ? %)<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void OnDOWNLOAD() </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int count = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned char dataInPort[6]; &nbsp; &nbsp;// буфер для записи</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned char dataFromPort[256];// буфер для чтения</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for ( int i=0 ; i&#60;6 ; i++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[i] = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for ( int j=0 ; j&#60;6 ; j++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataFromPort[j] = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HANDLE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hPort &nbsp; = {0}; &nbsp;// дескриптор порта</div><div class="code_line">&nbsp;&nbsp; &nbsp;DCB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dcbPort = {0}; &nbsp;// свойства порта</div><div class="code_line">&nbsp;&nbsp; &nbsp;COMMTIMEOUTS &nbsp; &nbsp;tm &nbsp; &nbsp; &nbsp;= {0}; &nbsp;// таймауты</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OVERLAPPED &nbsp;over &nbsp; &nbsp;= {0}; &nbsp; &nbsp; &nbsp;// параметры асинхронной передачи</div><div class="code_line">&nbsp;&nbsp; &nbsp;COMSTAT &nbsp; &nbsp; state &nbsp; = {0}; &nbsp; &nbsp; &nbsp;// параметры приема/передачи</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CFile magEvents; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// файл, куда записываются данные</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwWrite &nbsp; = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// фактическое число записанных байт</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwRead &nbsp; &nbsp;= 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// фактическое число прочитанных байт</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwWait &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD readed &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD eventMask = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD errorMask = 0; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD timeout = 500;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// открытие порта</div><div class="code_line">&nbsp;&nbsp; &nbsp;hPort = CreateFile(&quot;COM1&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GENERIC_WRITE | GENERIC_READ,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OPEN_EXISTING,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FILE_FLAG_OVERLAPPED,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( hPort==INVALID_HANDLE_VALUE )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка инициализации порта&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// очистка порта от старой информации</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int pc = PurgeComm(hPort, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( pc==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка PurgeComm()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int gcs = GetCommState(hPort, &amp;dcbPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( gcs==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка GetCommState()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dcbPort.BaudRate = CBR_9600;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dcbPort.fBinary &nbsp;= TRUE; &nbsp; &nbsp; &nbsp;// двоичный режим обмена</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dcbPort.fNull &nbsp; &nbsp;= FALSE; &nbsp; &nbsp; // нулевые байты не отбрасываются при передаче</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dcbPort.Parity &nbsp; = NOPARITY; &nbsp;// бит четности отсутствует</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dcbPort.ByteSize = 8; &nbsp; &nbsp; &nbsp; &nbsp; // число бит в байте</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dcbPort.StopBits = ONESTOPBIT;// один стоп-бит</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int scs = SetCommState(hPort, &amp;dcbPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( scs==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка SetCommState()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int gct = GetCommTimeouts(hPort, &amp;tm);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( gct==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка GetCommTimeouts()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tm.ReadIntervalTimeout &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 4;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tm.ReadTotalTimeoutConstant &nbsp; &nbsp; = 100; // из диалога настроек порта</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tm.ReadTotalTimeoutMultiplier &nbsp; = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tm.WriteTotalTimeoutConstant &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tm.WriteTotalTimeoutMultiplier &nbsp;= 4;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int sct = SetCommTimeouts(hPort, &amp;tm);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( sct==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка SetCommTimeouts()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dataInPort[0] = 0x01;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dataInPort[1] = 0x18;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dataInPort[2] = 0x00;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dataInPort[3] = 0x00;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unsigned short controlSum = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;controlSum = calcCRC((unsigned char *)dataInPort, 4);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dataInPort[4] = (controlSum &#62;&#62; 8);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dataInPort[5] = (unsigned char)controlSum;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// запись</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( over.hEvent == NULL )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка CreateEvent()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BOOL scm = SetCommMask(hPort, EV_RXCHAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( scm==FALSE )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка SetCommMask()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dwWrite = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dwWait &nbsp;= 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BOOL wf = WriteFile(hPort, &amp;dataInPort, 6 ,&amp;dwWrite, &amp;over);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( wf==TRUE )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка WriteFile()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int wce = WaitCommEvent(hPort, &amp;eventMask, &amp;over);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( (!wce) &amp;&amp; (GetLastError()==ERROR_IO_PENDING) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD wfso = WaitForSingleObject(hPort, timeout);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;switch ( wfso )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case WAIT_ABANDONED:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// не знаю что это такое</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;WaitForSingleObject: abandon&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case WAIT_OBJECT_0:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// не разобрался для чего это надо</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;че-та происходит&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case WAIT_TIMEOUT:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// считываем данные, если они есть</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( eventMask &amp; EV_RXCHAR )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dwRead &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;readed &nbsp;= 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int cce = ClearCommError(hPort, &amp;errorMask, &amp;state);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( cce==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка ClearCommError()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BOOL rf = ReadFile(hPort, &amp;dataFromPort, state.cbInQue, &amp;dwRead, &amp;over);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( rf==FALSE )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка ReadFile()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( dwRead==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// правильно?</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;таймаут истек&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// типа тут можно начинать обработку принятых данных?</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;можно начинать обработку данных...&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//где правда ?</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;device not response&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case &nbsp;WAIT_FAILED:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка WaitForSingleObject()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Ошибка WaitCommEvent()&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(over.hEvent);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hPort);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
протестил вышенаписанное  - все работает так как надо, но может есть замечания о некорректности?<br>
и мне неясны з МСДН некоторые вещи (в коде означены комментариями)]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683886</guid>
        <pubDate>Fri, 15 Apr 2005 09:27:25 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683886</link>
        <description><![CDATA[SVK: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=91173&view=findpost&p=683614'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>emp &#064; <time class="tag-quote__quoted-time" datetime="2005-04-15T05:53:01+00:00">15.04.05, 05:53</time></span><div class='quote '>я рад за тебя, AlexSm</div></div><br>
Ты лучше сделай поиск с выражением: COM+GetCommState - и тебе всё станет ясно, я надеюсь; можно ещё в FAQ заглянуть&#33;<br>
<br>
Также, &gt;&gt;&gt;<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=86803' target='_blank'>ещё</a>&lt;&lt;&lt; можно глянуть на сообщение под №8 ;D]]></description>
        <author>SVK</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683856</guid>
        <pubDate>Fri, 15 Apr 2005 09:02:22 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683856</link>
        <description><![CDATA[olddiller: <strong class='tag-b'>AlexSm</strong><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=91173&view=findpost&p=683079'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>AlexSm &#064; <time class="tag-quote__quoted-time" datetime="2005-04-14T15:00:26+00:00">14.04.05, 15:00</time></span><div class='quote '>Функция WaitCommEvent в оверлаппед-структуре требует наличия manual-reset эвента, а ты какой создал?</div></div> так он , вроде , такой и создал... :rolleyes:<br>
 <strong class='tag-b'>emp</strong> по-моему, не стоит смешивать таймауты и асинхронные операции .... надо использовать либо то, либо другое.]]></description>
        <author>olddiller</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683614</guid>
        <pubDate>Fri, 15 Apr 2005 05:53:01 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683614</link>
        <description><![CDATA[emp: я рад за тебя, AlexSm, что ты такой умный....только вот так вот разговаривать не надо ни с кем&#33;<br>Чем вот так пальцы веером пускать, лучше бы помог разобраться как все это сделать действительно корректно и  правильно&#33;&#33;<br><br><br>Может у тебя опыта в этом вопросе и достаточно, то я за это берусь впервые... и я не видел ни одного человека который бы что нибудь с первого раза сделал бы правильно.]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683079</guid>
        <pubDate>Thu, 14 Apr 2005 15:00:26 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=683079</link>
        <description><![CDATA[AlexSm: Вопрос 1)<br>
	Да уж...корректного я тут не увидел. Уж прости  :whistle: <br>
<br>
	При вызове WaitCommEvent ты теряешь статус завершённости асинх. операции записи.<br>
	А запись вообще завершилась? что-то я этого не вижу...<br>
	А если она отвалила с ошибкой записи последнего байта, то чего-же ты будешь ждать на WaitCommEvent?<br>
	На той стороне понимают незавершённые запросы? Да, в твоём случае ты легко можешь пролететь<br>
	по всему твоему циклу, и повторить запись. Но это разве корректно???<br>
	Функция WaitCommEvent в оверлаппед-структуре требует наличия manual-reset эвента, а ты какой создал?<br>
	При ожидании на WaitForSingleObject(hPort, 500) ты ждёшь завершения WaitCommEvent? Ты в этом<br>
	точно уверен??? А может PFILE_OBJECT::hEvent всё ещё настроен после вызова WriteFile?<br>
	Шансы зайти в обработку условия (eventMask &amp; EV_RXCHAR) согласен огромные, но c учётом ранее написанного -<br>
	они разве 100%?<br>
	Такое смелое указывание state.cbInQue при возможном превышении sizeof( dataFromPort) c хоть и малой,<br>
	но возможной долей вероятности схлопотать ошибку доступа на запись - это тож корректно?<br>
	Указывание употреблённой, и не прочищенной оверлаппед-структуры (с непонятным статусом hEvent) в ReadFile - это корректно?<br>
	GetOverlappedResult с указанным флагом FALSE (не дожидатся завершения асинх. операции) тут для чего? Ты разве <br>
	определяешь, что операция ещё ERROR_IO_INCOMPLETE? А уж последующий вызов ResetEvent на возможно не установленный,<br>
	и находящийся в прогрессе выполнения ReadFile - это вообще шедевр...<br>
<br>
	Помойму ты достаточно плохо понимаешь асинхронные вызовы. Почиталб что-нить на эту тему... :yes: <br>
<br>
Вопрос 2)<br>
	Насчет таймаутов - внимательно прочти следующее:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and less than MAXDWORD, one of the following occurs when the ReadFile function is called:<br>
<br>
    If there are any characters in the input buffer, ReadFile returns immediately with the characters in the buffer. <br>
    If there are no characters in the input buffer, ReadFile waits until a character arrives and then returns immediately. <br>
    <strong class='tag-b'>If no character arrives within the time specified by ReadTotalTimeoutConstant, ReadFile times out.</strong><br>
</div></div>]]></description>
        <author>AlexSm</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=682895</guid>
        <pubDate>Thu, 14 Apr 2005 12:54:18 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=682895</link>
        <description><![CDATA[CheshireCat: Хм, в чем проблема-то? Если функция <strong class='tag-b'>SetPortTimeouts()</strong> отработала успешно, а за положенное таймаутами время из порта не был получен байт/пакет (см.в MSDN), то функция <strong class='tag-b'>ReadFile()</strong> вернет FALSE. Вот и проверяй результат - коли ЛОЖЬ, то девайс тебе не ответил, коли ПРАВДА, то обмен идет успешно.<br>
Кстати, зачем ты в каждой итерации открываешь и закрываешь порт? Имхо достаточно сделать это один раз перед началом обмена и закрыть после окончания обмена.]]></description>
        <author>CheshireCat</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=682844</guid>
        <pubDate>Thu, 14 Apr 2005 12:28:25 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=682844</link>
        <description><![CDATA[emp: неужели никто ничего не подскажет ? :)<br>понятно что лень даже до конца читать пост :)<br><br>ps: не использовать таймауты нельзя :( надо один раз просто с этим разобраться &#33;]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=682707</guid>
        <pubDate>Thu, 14 Apr 2005 11:08:26 +0000</pubDate>
        <title>COM-порт и таймауты</title>
        <link>https://forum.sources.ru/index.php?showtopic=91173&amp;view=findpost&amp;p=682707</link>
        <description><![CDATA[emp: Доброго дня всем&#33;<br>
Спешу к вам за помощью.<br>
<br>
Вопрос касается организации приема/передачи данных из COM-порта в использованием таймаутов.<br>
<br>
Перед выполнением нижеследующей функции я устанавливаю следующие параметры порта:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// установка параметров порта</div><div class="code_line">GetCommState(hPort, &amp;dcbPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp;dcbPort.BaudRate = CBR_9600;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dcbPort.fBinary &nbsp;= TRUE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dcbPort.fNull &nbsp; &nbsp;= FALSE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dcbPort.Parity &nbsp; = NOPARITY;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dcbPort.ByteSize = 8;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dcbPort.StopBits = ONESTOPBIT;</div><div class="code_line">SetCommState(hPort, &amp;dcbPort);</div><div class="code_line">// таймауты не использую</div></ol></div></div></div></div><br>
<br>
Вначале приведу работающий кусок кода из моей программы без использования таймаутов:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void OnDOWNLOAD() </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int count = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned char dataInPort[6]; &nbsp; &nbsp;// буфер для записи</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned char dataFromPort[256];// буфер для чтения</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for ( int i=0 ; i&#60;6 ; i++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[i] = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for ( int j=0 ; j&#60;256 ; j++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataFromPort[j] = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HANDLE &nbsp; &nbsp; &nbsp;hPort &nbsp; = {0}; &nbsp;// дескриптор порта</div><div class="code_line">&nbsp;&nbsp; &nbsp;DCB &nbsp; &nbsp; dcbPort = {0}; &nbsp;// свойства порта</div><div class="code_line">&nbsp;&nbsp; &nbsp;COMMTIMEOUTS &nbsp; &nbsp;tm &nbsp;= {0}; &nbsp;// таймауты</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OVERLAPPED &nbsp;over &nbsp; &nbsp;= {0}; &nbsp;// параметры асинхронной передачи</div><div class="code_line">&nbsp;&nbsp; &nbsp;COMSTAT &nbsp; &nbsp; state &nbsp; = {0}; &nbsp;// параметры приема/передачи</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CFile magEvents; &nbsp; &nbsp; &nbsp; &nbsp;// файл, куда записываются данные</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwWrite &nbsp; = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwRead &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD readed &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD dwWait &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD errorMask = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD eventMask = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for ( ; ; )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[0] = 0x01;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[1] = 0x18;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[2] = 0x00;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[3] = 0x00;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[4] = 0x81;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;dataInPort[5] = 0xDF;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;HANDLE hPort; // дескриптор порта</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DCB &nbsp;dcbPort; // дескриптор структуры свойств порта</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;OVERLAPPED over = {0};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;COMSTAT state &nbsp; = {0};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;CFile magEvents;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWORD errorMask = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hPort = CreateFile(&quot;COM1&quot;, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( hPort==INVALID_HANDLE_VALUE )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Порт не настроен!\nДля настройки воспользуйтесь меню:\n\&quot;Настройки\COM-порт\&quot;.&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle(hPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PurgeComm(hPort, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetCommState(hPort, &amp;dcbPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// запись в порт</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dwWrite = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WriteFile(hPort, &amp;dataInPort, 6, &amp;dwWrite, &amp;over);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чтение из порта</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetCommMask(hPort, EV_RXCHAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;over.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;eventMask = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int wce = WaitCommEvent(hPort, &amp;eventMask, &amp;over);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( (!wce) &amp;&amp; (GetLastError()==ERROR_IO_PENDING) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WaitForSingleObject(hPort, 500/*см. ниже &quot;вопрос 1&quot;*/);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( eventMask &amp; EV_RXCHAR )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dwRead &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;readed &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ClearCommError(hPort, &amp;errorMask, &amp;state);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ReadFile(hPort, &amp;dataFromPort, state.cbInQue, &amp;dwRead, &amp;over);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GetOverlappedResult(hPort, &amp;over, &amp;readed, FALSE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResetEvent(over.hEvent);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unsigned short registerCount = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unsigned short &nbsp; &nbsp; byteCount = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;registerCount = (dataFromPort[4] &#60;&#60;8 | dataFromPort[5]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;byteCount = (dataFromPort[2] &#60;&#60;8 | dataFromPort[3]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( registerCount==0 &amp;&amp; count==0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Данных в журнале нет&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle(hPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( registerCount == 0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AfxMessageBox(&quot;Журнал сохранен&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle(hPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;count += 1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;///////////////////////// сортировка данных и сохранение их в файл</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//не обращайте внимания на этот кусок</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;unsigned char* data;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data = new unsigned char[255];</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for ( int count=0 ; count&#60;=( (int)byteCount-2 ) ; count++ )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;data[count] = dataFromPort[count+6];</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;magEvents.Open(&quot;events.mag&quot;, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;magEvents.Seek(0, CFile::end);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;magEvents.Write(data, ((int)byteCount-2) );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;magEvents.Close();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;delete data;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//////////////////////////////////////////////////////////////////</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PurgeComm(hPort, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CloseHandle(hPort);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div> <br>
<br>
<br>
<br>
Вопрос 1:<br>
У меня данных максимум может идти до 256 байт, <br>
так вот за эти 500 мс я успеваю (в случае прихода всех 256 байт) полностью их успеть прочитать при скорости 9600.<br>
Вопрос 2: (вытекает из вопроса 1)<br>
использование вышеприведенной реализации функции с использованием 500мс (см. вопрос 1) не совсем то, что мне надо (хотя все<br>
работает корректно&#33;&#33;). Появилась на необходимость использования таймаутов и с ними я никак :( ваще никак не могу раобраться<br>
. Помогите в етом плиз.<br>
<br>
Там де я заполняю структуру DCB там же я устанавливаю значения тайимаутов, например такие:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// установка таймаутов (для скорости 9600)</div><div class="code_line">GetCommTimeouts(hPort, &amp;tm);</div><div class="code_line">&nbsp;&nbsp; &nbsp;tm.ReadIntervalTimeout &nbsp; &nbsp; &nbsp;= 4;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tm.ReadTotalTimeoutConstant = 100;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tm.ReadTotalTimeoutMultiplier &nbsp; = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tm.WriteTotalTimeoutConstant &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tm.WriteTotalTimeoutMultiplier &nbsp;= 4;</div><div class="code_line">SetCommTimeouts(hPort, &amp;tm);</div></ol></div></div></div></div><br>
<br>
вот я установил....и что дальше я не могу понять, как мне переделать мою функцию чтобы при превышении вот этих таймаутов<br>
заканчивалась процедура записи/чтения.<br>
<br>
Нужно мне все это для того, чтобы:<br>
1. если девайс не отвечает, программа не висла. Типа ждем заданный интервал времени и если байт не появляется, выдаем нечто<br>
типа: m_static.SetWindowText(&quot;Девайс не отвечает&quot;); и повторять это сообщение надо до тех пор пока девайс не станет отвечать.<br>
В случае, если девайс отвечает и идет обмен данными, выводить типа: m_static.SetWindowText(&quot;Девайс в работе&quot;);<br>
2. ну и для того, чтобы удовлетворить моего руководителя. :) . Хотя пункт 1 - это для самоудовлетворения :)]]></description>
        <author>emp</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      </channel>
      </rss>
	