Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-97343
Коля
2002-05-20 04:02
2002.05.30
Как прервать цикл?


3-97134
Lightning
2002-05-04 22:51
2002.05.30
Пароль на базу данных


4-97458
poiZon
2002-03-27 15:24
2002.05.30
Hook


3-97164
MaXie
2002-05-06 11:39
2002.05.30
Как граммотно обеспечить доступ к сис.таблице?


3-97151
Саша
2002-05-06 12:37
2002.05.30
EDBEngineError Translate error.Value out of bounds





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский