|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
|  | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Как определить пуст ли буфер Com порта Помогите пожалуйста. Я не совсем ещё разбираюсь в Delphi, "не разбираюсь совсем" тоже подходит. Уверен, что Синтаксис, процедура, параметры и Люцифер синонимы. Но очень пытаюсь разубедиться. Как определить пустой буфер или там есть данные. Собственно на ком порте заглушка с соединёнными RX-TX. То есть, то что выдал, сразу попадает в буфер назад. На компе запущен монитор ,которым это дело контролируется . Остальные сигналы никак не используются , не участвуют и не предполагается использовать. На трёх проводах будет висеть контроллер , сливающий и принимающий в час по чайной ложке . Вот эээ... "код" Delphi. Код: var
  hFile :THandle; 
  ByteWritten : cardinal;
  temp :string; // это будет отправляться
  namefile:Pchar; // имя файла
  COMStat: TCOMStat; // переменная для определения данных в буфере
  xn: THandle;
myBuff:string[11];  
begin
  temp:='Hello World!'; // строка для записи в файл
  namefile:='COM3';      // Имя файла для создания
  hFile:= CreateFile(namefile,GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE,nil,CREATE_ALWAYS,0,0); // Открывается порт 
  WriteFile(hFile, temp[1], Length(temp),ByteWritten, nil); // пишется строка в порт
ClearCommError(hFile,xn,@COMStat); //получаем    состояние    COM в   StatCOM
xn:=COMStat.cbInQue;  // в  cblnQue должно вроде быть количество  байтов в  буфере 
ShowMessage(IntTostr(xn)) ;    // показывается сколько ж там  - фигсдва... НОЛЬ
ReadFile(hFile,MyBuff,SizeOf(MyBuff),ByteReaded,Nil); // А ТУТ ПРЕЛЬСТИВО ВЫЯСНЯЕТСЯ  - ЧТО ВСЯ СТРОКА ТАМ ЛЕЖИТ.
  CloseHandle(hFile); // ипец 
end.Последний раз редактировалось zagma, 12.03.2013 в 20:27. | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   Используй API-функцию (описана в справке SDK): Код: PurgeComm( HANDLE hFile, // дескриптор порта DWORD dwFlags // флаг действия ); // dwFlags - Этот параметр м.б. комбинацией следующих значений: // PURGE_TXABORT - Прерывает операцию записи в порт даже если она не завершена; // PURGE_RXABORT - То же для операции чтения; // PURGE_TXCLEAR - Очищает выходной буфер (запись), т.е. компьютер можно не перезагружать ; // PURGE_RXCLEAR - Очищает входной буфер (чтение). пример: Код: //очитска PurgeComm(Com,PURGE_RXCLEAR or PURGE_TXCLEAR); // проверка буфера function ReadCh(Var Ch:Byte): dword; var n : dword; begin Readfile(Com, ch, 1, result, nil); end; хотя можно организовать цикл чтения порта до тех пор пока не будут возвращаться пустые значения - это и означает, что буфер порта пуст. Последний раз редактировалось RusMaXXX, 12.03.2013 в 20:00. | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Спасибо за ответ, но это немного не то что мне нужно (я неправильно сформулировал вопрос-хаос в голове уже)... мне нужно понять что в моём примере не так. Почему вместо числа байт в буфере показывается ноль, когда там лежит 12 байт.  А очищается он итак когда я его читаю. Если сработает адекватно, то можно будет читать только тогда , когда там что то есть и считывать столько сколько там лежит. Последний раз редактировалось zagma, 12.03.2013 в 20:25. | 
| 
			 
			#4  
			
			
			
			
		 | |||
| 
 | |||
|   Затык выяснен,.... на момент проверки ещё не окончена выдача в порт, а следовательно ещё идёт приём... если подождать немного, то всё как надо. |