![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как мне инициализировать сразу два порта(СОМ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 то другая функция!