![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
COM - порт. Тестирование.
dosik © (2004-07-31 23:48:00)Добрый день, господа программеры. Суть задачи такова. На com порте стоит заглушка, т.е. получается обыкновенное эхо. Почему же это тогда не работает???
var
hPort : THandle;
rand : array[1..1] of byte;
Size : DWORD;
over : TOverlapped;
begin
if lvPorts.ItemIndex>-1 then
begin
hPort:=CreateFile(PChar(lvPorts.Items[lvPorts.ItemIndex]),GENERIC_READ and GENERIC_WRITE,0,
nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
if Succeeded(hPort) then
begin
Randomize;
rand[1]:=Random(100);
Size:=1;
if WriteFile(hPort,rand,Size,Size,@over) then
ShowMessage('yes')
else
ShowMessage(IntToStr(GetLastError));
if ReadFile(hPort,rand,1,Size,@over) then
ShowMessage('yes');
else
ShowMessage(IntToStr(GetLastError));
CloseHandle(hPort);
end;
end;
И там и там ошибка 5 (отказ в доступе) :(
dosik (2004-08-02 00:22:00) [1]Отвечаю сам себе:
не GENERIC_READ and GENERIC_WRITE а GENERIC_READ orGENERIC_WRITE. Как я это упустил??? )))
dosik (2004-08-01 23:10:00) [2]Вот, так, только не работает все равно:
hPort:=CreateFile(PChar(lvPorts.Items[lvPorts.ItemIndex]),GENERIC_READ and GENERIC_WRITE,0,
nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
if Succeeded(hPort) then
begin
if SetupComm(hPort,SizeOf(DWORD),SizeOf(DWORD)) then
ShowMessage('Setup')
else
ShowMessage('ERROR SETUP : '+IntToStr(GetLastError));
if GetCommState(hPort,PortDCB) then
ShowMessage('Get DCB')
else
ShowMessage('ERROR GET DCB : '+IntToStr(GetLastError));
PortDCB.BaudRate:=CBR_9600;
PortDCB.Parity:=1;
PortDCB.ByteSize:=5;
PortDCB.StopBits:=ONESTOPBIT;
if SetCommState(hPort,PortDCB) then
ShowMessage('Set DCB')
else
ShowMessage('ERROR SET DCB : '+IntToStr(GetLastError));
if GetCommTimeouts(hPort,PortTime) then
ShowMessage('Get COMTimeouts')
else
ShowMessage('ERROR GET COMTimeouts : '+IntToStr(GetLastError));
PortTime.ReadTotalTimeoutConstant:=50;
PortTime.ReadIntervalTimeout:=MAXDWORD;
PortTime.ReadTotalTimeoutMultiplier:=MAXDWORD;
PortTime.WriteTotalTimeoutMultiplier:=1000;
PortTime.WriteTotalTimeoutConstant:=1500;
if SetCommTimeouts(hPort,PortTime) then
ShowMessage('Set COMTimeouts')
else
ShowMessage('ERROR SET COMTimeouts : '+IntToStr(GetLastError));
Randomize;
for i:=1 to 10 do
rand[i]:=Random(65535);
Size:=10;
if WriteFile(hPort,rand,Size,Size,@over) then
ShowMessage('WRITE : '+IntToStr(Rand[1]))
else
ShowMessage('ERROR WRITE : '+IntToStr(GetLastError));
if ReadFile(hPort,rand,Size,Size,@over) then
ShowMessage('READ : '+IntToStr(Rand[1]))
else
ShowMessage('ERROR READ : '+IntToStr(GetLastError));
CloseHandle(hPort);
end;
??? Может кто кинет ссылку как правильно это делается и что означают параметры. Только желательно на русском. )))
tesseract (2004-08-01 14:40:00) [3]А зачем Overlapped если не используещь Wait? и что за Succeeded(hPort) ? типа на больше ноля проверяет? и зачем randomize? а SetCommState где? поставь пораметры порта и сбрось PurgeCom. У тебя заглушка 2-3? а DTR/DSR, CTS/RTS? Ну и главное PChar(lvPorts.Items[lvPorts.ItemIndex]) - так делать в 6-7 не рекомендуется - сделай pcharPort= Pchar(stringPort)