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

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

Как мне инициализировать сразу два порта(СОМ1 и СОМ2) [D6, Win2k]


Relaxxx ©   (2004-09-13 18:14:00) 

Я вот раньше пользовался такими процедурами для работы с ком портом
procedure PortInitCOM1;
 var
  ThreadID:dword;
begin
 KolByte1:=0;

 Com1Handle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

 SetCommMask(Com1Handle,EV_RXFLAG);

  GetCommState(Com1Handle,DCB1);
  DCB1.BaudRate:=CBR_9600;
  DCB1.Parity:=NOPARITY;
  DCB1.ByteSize:=8;
  DCB1.StopBits:=OneStopBit;
  DCB1.EvtChar:=chr(13);
  SetCommState(Com1Handle,DCB1);
  Com1Thread := CreateThread(nil,0,@ReadCOM1,nil,0,ThreadID);
end;

procedure ReadCOM2;
 var
  Resive:array [0..255] of char;
  i:integer;
begin
  while true do
  begin
   TransMask2:=0;
   WaitCommEvent(Com2Handle,TransMask2,@Ovr2);
   if (TransMask2 and EV_RXFLAG)=EV_RXFLAG then
    begin
     ClearCommError(Com1Handle,Errs2,@Stat2);
     Kols2 := Stat2.cbInQue;
     ReadFile(Com2Handle,Resive,Kols2,Kols2,@Ovr2);
     CodeCOM2:='';
     Code_tekCOM2:='';
     Code_tekCOM2:=StringReplace(string(Resive), '*', '', [rfIgnoreCase]);
     for i:=1 to 11 do
     begin
       CodeCOM2:=CodeCOM2+Code_tekCOM2[i];
     end;
    end;//mask
   end;//while
end;




все бы ничего но вот теперь мне нужно работать сразу с двумя портами, а когда я делаю инициализацию двух портов у меня работает только последний, что я делаю не так???


simpson   (2004-09-14 11:33:00) [1]

> Erik1 ©   (14.09.04 11:16) [6]
> И вобще лучше используй готовые компоненты

Очень спорное утверждение. Особенно, для такой несложной задачи.

Автору: прочитай описание функции WaitCommEvent в MSDN. Особенно секцию "remarks".
Плодить потоки для асинхронного считывания данных из нескольких портов, по-моему, не лучшая идея. Один поток + WaitForMultipleObjects.


Relaxxx   (2004-09-14 11:24:00) [2]

Блин, да что за фигня...пролазил кучу сайтов в поисках компонента для СОМ портов. Понравились по описаниям 2 компонента
Winsoft ComPort( http://www.winsoft.sk/comport.htm) и Tcomport by Dejan Crnila.
Но блин, первый немогу найти не триальный, а второй не ставится под 6 делфи


Erik1   (2004-09-14 11:16:00) [3]

И вобще лучше используй готовые компоненты, а то у тебя чтото странное написано. Компонентоа полно на Torry.net Мне нравится
VARIAN ASYNC32 COMPONENT v1.48 я сам переделал именно этот компонент в нем используется именно асинхроная работа с com портом.


jack128   (2004-09-13 23:20:00) [4]

а где у тя выход из процедуры ReadCOM2? вроде как бесконечный цикл.. и где процедура ReadCOM2?
И еще - поменьше используй глобальные переменные..


Relaxxx   (2004-09-13 22:56:00) [5]

пробовал, почему-то не работает


GuAV   (2004-09-13 21:43:00) [6]

Relaxxx   (13.09.04 18:54) [1]
В одном потоке один порт, в другом другой - чем не вариант.


Relaxxx   (2004-09-13 21:42:00) [7]

ну хоть компоненты подскажите для Д6 для работы с ком-портами


Relaxxx   (2004-09-13 18:54:00) [8]

Ладно я понял что в коде никто разбераться не будет, тогда просто, как мне получить асинхронный доступ к СОМ портам, тоесть вот какая у меня задача:
к обеим ком портам подключины считыватели штрихкода и мне нужно если с СОМ1 приходят данные выполняентся определенная функция которая обрабатывает эданные, если с СОМ2 то другая функция!


Наверх

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