|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
Затык выяснен,.... на момент проверки ещё не окончена выдача в порт, а следовательно ещё идёт приём... если подождать немного, то всё как надо.
|