Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.03.2013, 19:37
zagma zagma вне форума
Прохожий
 
Регистрация: 12.03.2013
Сообщения: 3
Репутация: 10
По умолчанию Как определить пуст ли буфер 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  
Старый 12.03.2013, 19:57
Аватар для RusMaXXX
RusMaXXX RusMaXXX вне форума
Начинающий
 
Регистрация: 01.10.2008
Сообщения: 138
Версия Delphi: 7
Репутация: 21
Сообщение

Используй 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.03.2013, 20:12
zagma zagma вне форума
Прохожий
 
Регистрация: 12.03.2013
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо за ответ, но это немного не то что мне нужно (я неправильно сформулировал вопрос-хаос в голове уже)... мне нужно понять что в моём примере не так. Почему вместо числа байт в буфере показывается ноль, когда там лежит 12 байт.
А очищается он итак когда я его читаю.
Если сработает адекватно, то можно будет читать только тогда , когда там что то есть и считывать столько сколько там лежит.

Последний раз редактировалось zagma, 12.03.2013 в 20:25.
Ответить с цитированием
  #4  
Старый 12.03.2013, 22:31
zagma zagma вне форума
Прохожий
 
Регистрация: 12.03.2013
Сообщения: 3
Репутация: 10
По умолчанию

Затык выяснен,.... на момент проверки ещё не окончена выдача в порт, а следовательно ещё идёт приём... если подождать немного, то всё как надо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter