Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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)


Наверх

Титульная страница Поиск, карта сайта Написать письмо