Форум: "Система";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];
Внизнарод, помогите пожалуйста!!! Найти похожие ветки
← →
pvn (2002-03-06 05:57) [0]я пытаюсь послать-получитьданные на ком2.
код вот какой:
PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
StrPCopy(S, "AT"+ #13 + #10);
if not WriteFile(hPort, S, StrLen(S), actual_bytes, POVERLAPPED(0)) then
begin
ShowMessage("Can""t write to port: " + IntToStr(GetLastError)) ;
Exit;
end;
Memo2.Lines.Add(S);
i:=0;
if not WaitCommEvent(hPort, i, POVERLAPPED(0)) then
ShowMessage("cant wait get comm byte");
if not ReadFile(hPort, D, 1, actual_bytes, POVERLAPPED(0)) then
ShowMessage("Can""t read from port: " + IntToStr(GetLastError))
else
ShowMessage("Read " + IntToStr(actual_bytes) + " bytes");
отсылку вроде проходит, а на получении висит и ждет...
что я сделал неправильно?
← →
Coalycat (2002-03-06 12:47) [1]код посмотри
function GetReplyOnCommand (NumberToRead:Integer; var Reply:Array Of Byte):Integer;
var
AmountRead:Cardinal;
I : Integer;
AttemptCount: Integer;
begin
AttemptCount:=1;
Result:=-1;
i:=0;
while (I<NumberToRead-1) and (AttemptCount<10) do
begin
if ReadFile(HCOMM1,Reply[i],1,AmountRead,Nil)
then
if AmountRead=1
then begin
inc(I);
end
else Inc(AttemptCount);
end;
if (I=NumberToRead-1) and (AttemptCount<10)
then
begin
result:=0;
end
else
begin
if AttemptCount>=10 then
Result:=-2;
end;
end;
запись
function WriteCommandToPort(Command: Array of Byte):Integer;
var
Written:Cardinal;
begin
written:=0;
Result:=-1;
PurgeComm(HCOMM1,PURGE_RXCLEAR or PURGE_TXCLEAR);
if WriteFile(HCOMM1,Command[0],High(Command)+1,Written,Nil) then
if Written=Cardinal(High(Command)+1) then Result:=0
else Result:=-1;
end;
← →
EsKor (2002-03-07 03:46) [2]Для чтения я пользуюсь таким кодом:
function Receiving(hPort: THandle): String;
//Получить ответ
var
i: Cardinal;
ReadByteNum: Cardinal; //Кол-во принятых байтов
WaitByteNum: Cardinal; //Кол-во ожидаемых байтов при приеме
ReceivedByte: Cardinal; //Буфер приема
//Windows после, открытия порта, формирует свой буфер в который записывает
//все переданное внешним устройством, в частности весами. И функция ReadFile
//считывает данные именно из этого буфера. Проверено: после открытия и
//настройки порта, весы устанавливались в режим непрерывной передачи, через
//несколько секунд весы отключались (и даже выдергивался кабель связи),
//вызывалась функция ReadFile ... В общем считывалось данных о весе несколько
//десятков штук. При этом весы были настроены на работу в режиме аппаратного
//квитирования, а в программе никаких действий по установке этих сигналов не
//предпринималось.(?) Возможно это из-за настроек по умолчанию.(?)
begin
Result := ""; //Еще ничего не принято
i:=0; //Всего принято байтов (символов)
WaitByteNum := 1; //Кол-во ожидаемых байтов при приеме
repeat
if not ReadFile(hCOMport, ReceivedByte, WaitByteNum, ReadByteNum, nil) then
begin
ShowMessage("Ошибка чтения порта: #" + IntToStr(GetLastError));
Exit;
end
else
if ReadByteNum > 0 then
begin
if ReceivedByte in [13,10] then Break; //Конец строки
//Если внешнее устр-во передает оба символа, то второй из них
//останется в буфере. При следующем обращении к порту он будет
//получен первым, но функция возвратит пустую строку (отработает
//Break). В этом случае вызывающая процедура немедленно снова
//вызовет эту функцию, т.е. произойдет очистка буфера от уже
//ненужного символа, и будет считываться следующая строка.
Result := Result + Chr(ReceivedByte);
inc(i);
if i > 21 then Break; //нет конца строки - прекратить прием
end; {if NumReaded}
until ReadByteNum = 0; //Ничего нет или в процессе приема ничего не стало
//решить как обрабатывать строку если не было #13 и/или #10 и порт стал пуст
//(ReadByteNum = 0), хотя это маловероятный случай.
end; {function Receiving(hPort: THandle)}
Это совсем не образец для подражания, сделана эта функция скорее в стиле DOS. Привел как есть и даже с вопросами в комментариях.
Если ваша программа "висит и ждет", то скорее всего таймауты чтения не настраивались и все равны нулю. В этом случае если в порт ничего не поступает то программа действительно "висит и ждет" пока что-нибудь в порту не появиться. У меня значения таймаутов следующие:
ReadIntervalTimeout:=MAXDWORD; //При MAXDWORD и остальных нулях при чтении
ReadTotalTimeoutMultiplier:=0; //возвращается результат (без ожидания) даже
ReadTotalTimeoutConstant:=0; //если в порт ничего не поступило
Кстати, проверьте ваше внешнее устройство, точно ли оно отвечает на запросы. Я месяц - два назад был точно в такой же ситуации, две недели бился над приемом данных с весов ф.METTLER, пока не догадался их заменить, оказалось, что они не совсем исправны - команды принимали и выполняли, а вот ответ, при просмотре на осиллографе, больше походил на белый шум.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c