Форум: "Система";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];
ВнизНе могу прочесть с СОМ-порта!!!! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c