Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.05;
Скачать: CL | DM;

Вниз

Не могу прочесть с СОМ-порта!!!!   Найти похожие ветки 

 
v-king ©   (2003-04-03 19:59) [0]

Помогите. Открываю порт
hPort := CreateFile("COM1",GENERIC_READ,0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);

При помощи GetCommState считываю настройки, при помощи SetCommState загоняю их назад. Читаю данные
ReadFile(hPort, Buffer, 1024, ActualBytes, @OverLapped);

и - тишина. Но если запущу Гипертерминал, приму через него данные, потом потушу его - моя прога тоже начинает читать из порта. Что это? как справиться?


 
varfolomey ©   (2003-04-03 23:40) [1]

В чём твоя проблемма я не разбирался!!! Вот тебе (и всем остальным) пример работающего модуля!!!

unit com_io; <p>

interface <p>

uses SysUtils,windows,Classes; <p>

type <br>
Tcom=(com1,com2,com3,com4,com5,com6,com7,com8);<br>
Tbaud=(_9k6,_19k2,_38k4);<br>
ExCom= class(exception);<p>

function open_com(port: Tcom): Boolean;
// Процедура открытия COM порта <br>
procedure set_com(rate: Tbaud);
// Установка скорости <br>
procedure putb(b: byte; var ok: boolean);
// Запись байта данных в порт <br>
procedure getb(var b: byte; var ok: boolean);
// Чтение байта данных из порта <br>
procedure clr_com;
// Очистка порта <br>
procedure close_com;
// Закрытие порта <p>



implementation<p>

const <br>
cport: array [Tcom] of string =("COM1","COM2","COM3","COM4",
"COM5","COM6","COM7","COM8");<br>
cbr: array [Tbaud] of DWORD =(CBR_9600,CBR_19200,CBR_38400);
// COM порт поддерживает скорость до 115200 но для этого необходимо внести мелкие изменения <p>

var <br>
is_open: boolean = false; <br>
com: Thandle; <br>
DCB: TDCB; <p>

function open_com(port: Tcom): boolean; <br>
begin <br>
if is_open then closeHandle(com); <br>
com := CreateFile(PChar(cport[port]), GENERIC_READ or GENERIC_WRITE, <br>
0, nil, OPEN_EXISTING, <br>
FILE_ATTRIBUTE_NORMAL, 0); <br>
if GetCommState(com,DCB)then is_open:=true else is_open:=false; <br>
Result:=is_open; <br>
end; <p>

procedure set_com(rate: Tbaud); <br>
begin <br>
DCB.DCBlength:=SizeOf(Tdcb); <Br>
DCB.BaudRate:= cbr[rate]; <br>
DCB.ByteSize:=8; <br>
if not SetCommState(com, DCB) then raise Excom.Create("set_com"); <Br>
end; <p>

procedure putb(b: byte; var ok: boolean); <br>
var res: dword; <br>
begin <br>
WriteFile(com,b,1,res,nil); <br>
ok:=(res=1); <br>
end; <p>

procedure getb(var b: byte; var ok: boolean); <br>
var res: dword; <br>
begin <br>
ReadFile(com, b, 1, res, nil); <br>
ok:=(res=1); <Br>
end; <p>

procedure clr_com; <br>
begin <Br>
PurgeComm(com,PURGE_RXCLEAR); <br>
end; <p>

procedure close_com; <br>
begin <Br>
if is_open then CloseHandle(com); <br>
is_open:=false; <br>
end; <p>

end.<p>

Пример использования модуля COM_IO<p>

..................................<p>
procedure COM;<br>
var <br>
ok: boolean;
// Содержит результат опирации <br>
b: byte;
// Содержит данные <br>
begin <br>
open_com(com1)
// Открытие порта; <br>
set_com(_9k6);
// Установка скорости 9600 <br>
PutB($AA,ok);
// Посылка байта данных <br>
GetB(b,ok);
// Приём байта данных <br>
close_com;
// Закрытие порта <br>
end; <p>
..................................<p>

В данной процедуре мы открываем COM 1 на скоросте 9600<br>
Посылаем 1 байт и принимаем 1 байт <br>
Затем закрываем порт <p>

Все пожелания и замечания пишите мне: <a href="mailto:varfolomey@ukr.net">varfolomey@ukr.net</a><br>
С уважением Георгий


 
varfolomey ©   (2003-04-03 23:40) [2]

В чём твоя проблемма я не разбирался!!! Вот тебе (и всем остальным) пример работающего модуля!!!

unit com_io; <p>

interface <p>

uses SysUtils,windows,Classes; <p>

type <br>
Tcom=(com1,com2,com3,com4,com5,com6,com7,com8);<br>
Tbaud=(_9k6,_19k2,_38k4);<br>
ExCom= class(exception);<p>

function open_com(port: Tcom): Boolean;
// Процедура открытия COM порта <br>
procedure set_com(rate: Tbaud);
// Установка скорости <br>
procedure putb(b: byte; var ok: boolean);
// Запись байта данных в порт <br>
procedure getb(var b: byte; var ok: boolean);
// Чтение байта данных из порта <br>
procedure clr_com;
// Очистка порта <br>
procedure close_com;
// Закрытие порта <p>



implementation<p>

const <br>
cport: array [Tcom] of string =("COM1","COM2","COM3","COM4",
"COM5","COM6","COM7","COM8");<br>
cbr: array [Tbaud] of DWORD =(CBR_9600,CBR_19200,CBR_38400);
// COM порт поддерживает скорость до 115200 но для этого необходимо внести мелкие изменения <p>

var <br>
is_open: boolean = false; <br>
com: Thandle; <br>
DCB: TDCB; <p>

function open_com(port: Tcom): boolean; <br>
begin <br>
if is_open then closeHandle(com); <br>
com := CreateFile(PChar(cport[port]), GENERIC_READ or GENERIC_WRITE, <br>
0, nil, OPEN_EXISTING, <br>
FILE_ATTRIBUTE_NORMAL, 0); <br>
if GetCommState(com,DCB)then is_open:=true else is_open:=false; <br>
Result:=is_open; <br>
end; <p>

procedure set_com(rate: Tbaud); <br>
begin <br>
DCB.DCBlength:=SizeOf(Tdcb); <Br>
DCB.BaudRate:= cbr[rate]; <br>
DCB.ByteSize:=8; <br>
if not SetCommState(com, DCB) then raise Excom.Create("set_com"); <Br>
end; <p>

procedure putb(b: byte; var ok: boolean); <br>
var res: dword; <br>
begin <br>
WriteFile(com,b,1,res,nil); <br>
ok:=(res=1); <br>
end; <p>

procedure getb(var b: byte; var ok: boolean); <br>
var res: dword; <br>
begin <br>
ReadFile(com, b, 1, res, nil); <br>
ok:=(res=1); <Br>
end; <p>

procedure clr_com; <br>
begin <Br>
PurgeComm(com,PURGE_RXCLEAR); <br>
end; <p>

procedure close_com; <br>
begin <Br>
if is_open then CloseHandle(com); <br>
is_open:=false; <br>
end; <p>

end.<p>

Пример использования модуля COM_IO<p>

..................................<p>
procedure COM;<br>
var <br>
ok: boolean;
// Содержит результат опирации <br>
b: byte;
// Содержит данные <br>
begin <br>
open_com(com1)
// Открытие порта; <br>
set_com(_9k6);
// Установка скорости 9600 <br>
PutB($AA,ok);
// Посылка байта данных <br>
GetB(b,ok);
// Приём байта данных <br>
close_com;
// Закрытие порта <br>
end; <p>
..................................<p>

В данной процедуре мы открываем COM 1 на скоросте 9600<br>
Посылаем 1 байт и принимаем 1 байт <br>
Затем закрываем порт <p>

Все пожелания и замечания пишите мне: <a href="mailto:varfolomey@ukr.net">varfolomey@ukr.net</a><br>
С уважением Георгий


 
jack128 ©   (2003-04-03 23:53) [3]

varfolomey © (03.04.03 23:
Как пример всем остальным можт и нормально, а вот в данном случае не подходит, т к автор работает в асинхронном режиме...

v-king © (03.04.03 19:59)
Странно, конечно.

А вообще код в студию. Авось кто чего умного скажет...


 
GEN ©   (2003-04-04 00:22) [4]

Нечто похожее происходит в Dos Navigtor-е при выборе режима
"Terminal": выдается сообщение "Не могу найти Com порт"
Преодолеть это позволяет последовательное выключение а затем
включение Com порта в Панель управления/Система/Устройства, но
не всех машинах.


 
А   (2003-04-04 01:59) [5]

как насчет FlowControl? Всякие там DTR,RTS,DTS,CTS ? С этим Вы тоже разобрались?


 
крот ©   (2003-04-04 13:11) [6]

Надо обязательно установить размер входного и выходного буфферов, с помощью SetupComm и обязательно ненулевыми, а то тоже ничего считываться не будет. Таймауты тоже недурно было-бы установить, SetCommTimeouts. Может быть, не стоит открывать порт с параметром FILE_FLAG_OVERLAPPED, указать просто FILE_ATTRIBUTE_NORMAL?



Страницы: 1 вся ветка

Текущий архив: 2003.06.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-13257
Ренат
2003-05-23 16:53
2003.06.05
Обращение к объекту по имени


3-13032
Praco
2003-05-16 11:23
2003.06.05
При восстановлении из бэкапа часть индексов неактивны


1-13202
Intell
2003-05-25 20:11
2003.06.05
У кого есть компонент Hint или Menu с настройкой прозрачности?


1-13247
Felixx
2003-05-22 13:21
2003.06.05
TPopupActionBar


1-13307
Suhomlin
2003-05-25 00:29
2003.06.05
Взаимодействие с Outlook