Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.007 c
3-13095
Caesar
2003-05-19 10:43
2003.06.05
Несоответствие типов данных


14-13434
Aga
2003-05-15 17:58
2003.06.05
Новые свойства...


3-13074
YuraKiller
2003-05-17 00:42
2003.06.05
Как перейти с InterBase на FireBird


1-13128
reticon
2003-05-25 17:15
2003.06.05
Подсет одинаковых символов в строке


1-13299
KA-87
2003-05-24 12:45
2003.06.05
А как в программе можно реализовать подсветку синтаксиса?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский