![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение с СОМ-порта... [D7, WinXP]
Devider © (2005-11-18 15:30:00)Необходимо считать с СОМ, к которому подключен девайс для считывания с магнитной карты. Хочу, в Edit1 появился номер карты. Пишу:
// переменные :
strdcb:DCB;
cto:COMMTIMEOUTS;
hCom :Integer;
chOut :array[1..100] of char;
chIn :array[1..100] of char;
Temp :DWORD;
hdc :HDC;
i:integer;
a:integer;
// настройки порта при создании формы:
hCom:=CreateFile('COM1',GENERIC_WRITE and GENERIC_READ,0,psa,OPEN_EXISTING,0,0); //Ñîçäàåì CÎÌ-ïîðò
GetCommState(hCom,strdcb);
strdcb.BaudRate:=CBR_9600;
strdcb.ByteSize:=8;
strdcb.Parity:=NOPARITY;
strdcb.StopBits:=ONESTOPBIT;
SetCommState(hCom,strdcb);
cto.ReadIntervalTimeout := 0;
cto.ReadTotalTimeoutConstant:=0;
cto.ReadTotalTimeoutMultiplier:=10;
cto.WriteTotalTimeoutConstant:=0;
cto.WriteTotalTimeoutMultiplier:=0;
SetCommTimeouts(hCom,cto);
SetupComm(hCom,sizeof(chOut),sizeof(chOut));
PurgeComm(hCom,PURGE_RXCLEAR);
PurgeComm(hCom,PURGE_TXCLEAR);
// запущаем таймер
ComTimer.Enabled:=true;
end;
// по таймеру происходит вот что:
ReadFile(hCom,chOut,100,Temp,nil);
Edit1.Text:=chOut;
А в Эдите ничего не отображается. Непойму, почему.
Помогите разобраться, пожалуйста!
tesseract (2005-11-20 18:19:00) [1]
port:pchar;
port='COM1';
hCom:=CreateFile(Port,GENERIC_READ OR GENERIC_WRITE,0,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
// Если неверен выходим
if hCom=INVALID_HANDLE_VALUE then exit;
так точно работает
Devider (2005-11-18 19:03:00) [2]Вернее даже так:
после:
hCom:=CreateFile('COM1',GENERIC_READ,0,psa,OPEN_EXISTING,0,0);
SysErrorMessage(GetLastError) выдает "Неверная попытка доступа к адресу памяти". Ниччего не понимаю...
Devider (2005-11-18 18:57:00) [3]Фсе я наврал.
hCom:=CreateFile('COM1',GENERIC_READ,0,psa,OPEN_EXISTING,0,0);
if (hCom = INVALID_HANDLE_VALUE) then exit;
//.....................................
//настройки порта, см выше.
ShowMessage('Done'); // это последняя строчка
Если я вижу это собщение, значит, дескриптор все-таки верный, правильно?
Но:
b:=ReadFile(hCom,chOut,100,Temp,nil);
if (b = false) then begin
Edit1.Text := SysErrorMessage(GetLastError);
exit;
end;
Edit1.Text := chOut;
этот кусок выдает "неверный дескриптор".. Это как понять?
Devider (2005-11-18 18:09:00) [4]Порт открывается, закрывается, как в известной детской передаче.
Оказалось, косячит ReadFile().
По крайней мере, на строку
if (ReadFile(hCom,chOut,100,Temp,nil) = false) then Edit1.Text := 'Опаньки';
я это "Опаньки" и получаю...
Leonid Troyanovsky (2005-11-18 16:36:00) [5]
> Devider © (18.11.05 16:27) [4]
> Ну, на уровне осознания отличий функции от процедуры, это
> однозначно. Я вообще льщу себе надеждой, что повыше будет.
Например, ReadFile
If the function fails, the return value is zero.
To get extended error information, call GetLastError.
Хотя, положено нАчать еще раньше, т.е. c CreateFile
If the function fails, the return value is INVALID_HANDLE_VALUE.
To get extended error information, call GetLastError.
Т.е., Win32Check тебе в руки и вперед.
И нам понятней будет.
--
Regards, LVT.
Ботвин Дмитрий (2005-11-18 16:31:00) [6]Devider © (18.11.05 15:30)
ReadFile что возвращает? И что пишет GetLastError по этому поводу?
Devider (2005-11-18 16:27:00) [7]Ну, на уровне осознания отличий функции от процедуры, это однозначно. Я вообще льщу себе надеждой, что повыше будет. Да объясните уже, не томите, мож у меня мозг просто к концу недели спекся!
Предистория такая: есть аналогичный код на С++, а это его попытка перевести на Дельфи.
Leonid Troyanovsky (2005-11-18 16:14:00) [8]
> Devider © (18.11.05 15:53) [2]
> ты не мог бы поконкретнее?
Можно и конкретней.
Однако, для этого необходимо уяснить уровень подготовки.
Есть ли смысл рассказывать про космические корабли,
бороздящие просторы .. Большого театра.
--
Regards, LVT.
Devider (2005-11-18 15:53:00) [9]ты не мог бы поконкретнее?
Digitman (2005-11-18 15:48:00) [10]ты что-либо слышал про отличие функции и процедуры ?