Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi & Com порт 
:(
    Опции темы
DmitryV.
  Дата 26.4.2004, 14:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите, пожалуйста, новичку! Надо получить данные с сом порта. Полазил по инету - понял: надо на API функциях писать, примеров накачал и попытался...;( Ерунда какая то получается, а информации мало;(, справка - аглицкая. Теперь решил компоненты разные поюзать. А вообще вопрос такой: как мне получить данные в формате простой последовательности бит, а то читаются данные в формате char. Ситуация такая: подключено устройство к порту - контакт DCD(1 нога), надо чтобы постоянно на RTS была 1 (конструктивно). Считываем со скоростью 38400б/с данные в формате "011010", по мере прихода этих данных на порт. Как их считать? Помогите кто чем может,а то уже совсем замучился 8-(.
  Вверх
x77
Дата 27.4.2004, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: -1
Всего: 22



это песня длинная. я приведу пример кода из рабочего проекта, там будет куча всяких констант и пр. мути, но самое главное (как открыть порт, настроить, прочитать, записать) ты там увидишь.по крайней мере, саму логику.
Код

var
   hCom: THandle;
   rByte: char;
   Packet: array [0..MAXLENGTHPACKET-1] of char;
   Buf: array [0..LENGTHMEMORY-1] of char;
   WRITEOVERLAPPED: TOVERLAPPED;
   READOVERLAPPED: TOVERLAPPED;

   procedure OpenCom;
   procedure CloseCom;
   procedure SetupCom(BaudRate: DWORD);
   procedure ClearCom;
   function WriteCom(Packet: array of char; NumberOfBytesToWrite: DWORD): integer;
   function ReadCom(var rByte; NumberOfBytesToRead: DWORD): integer;

implementation

procedure OpenCom;
begin
 if hCom=INVALID_HANDLE_VALUE then
   begin
     hCom:=CreateFile(curCom, GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
     if hCom=INVALID_HANDLE_VALUE then
       raise Exception.Create('Невозможно открыть порт!');
   end;
end;

procedure CloseCom;
begin
 if hCom=INVALID_HANDLE_VALUE then exit;
 if CloseHandle(hCom) then
   hCom:=INVALID_HANDLE_VALUE
 else
   raise Exception.Create('Невозможно закрыть порт!');
end;

procedure SetupCom(BaudRate: DWORD);
var DCB: TDCB;
   COMMTIMEOUTS: TCOMMTIMEOUTS;
begin
 if hCom=INVALID_HANDLE_VALUE then exit;
 if GetCommState(hCom, DCB) then
   begin
     DCB.BaudRate:=BaudRate;
     DCB.ByteSize:=8;
     DCB.Parity:=NOPARITY;
     DCB.StopBits:=ONESTOPBIT;
     if SetCommState(hCom, DCB) then
       begin
         if GetCommTimeouts(hCom, COMMTIMEOUTS) then
           begin
             COMMTIMEOUTS.ReadIntervalTimeout:=0;
             COMMTIMEOUTS.ReadTotalTimeoutMultiplier:=RWPORTTIMEOUT;
             COMMTIMEOUTS.ReadTotalTimeoutConstant:=0;
             COMMTIMEOUTS.WriteTotalTimeoutMultiplier:=RWPORTTIMEOUT*LENGTHSD3;
             COMMTIMEOUTS.WriteTotalTimeoutConstant:=0;
             if SetCommTimeouts(hCom, COMMTIMEOUTS)and
                SetupComm(hCom, INQUEUE, OUTQUEUE){and
                EscapeCommFunction(hCom, SETDTR)and
                EscapeCommFunction(hCom, SETRTS)} then exit;
           end;
       end;
   end;
 CloseCom;
 raise Exception.Create('Невозможно настроить порт!');
end;

procedure ClearCom;
begin
 if hCom=INVALID_HANDLE_VALUE then exit;
 if not PurgeComm(hCom, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then
   begin
     CloseCom;
     raise Exception.Create('Невозможно очистить порт!');
   end;
end;

function WriteCom(Packet: array of char; NumberOfBytesToWrite: DWORD): integer;
var NumberOfBytesWritten: DWORD;
begin
 Result:=-1;
 if hCom=INVALID_HANDLE_VALUE then exit;
 if WriteFile(hCom, Packet, NumberOfBytesToWrite, NumberOfBytesWritten, @WRITEOVERLAPPED)and(NumberOfBytesWritten=NumberOfBytesToWrite) then
   Result:=NumberOfBytesWritten
 else
   raise Exception.Create('Ошибка записи в порт!');
end;

function ReadCom(var rByte; NumberOfBytesToRead: DWORD): integer;
var NumberOfBytesRead: DWORD;
begin
 Result:=-1;
 if hCom=INVALID_HANDLE_VALUE then exit;
 if ReadFile(hCom, rByte, NumberOfBytesToRead, NumberOfBytesRead, @READOVERLAPPED) then
   Result:=NumberOfBytesRead
 else
   raise Exception.Create('Ошибка чтения из порта!');
end;

Добавлено @ 10:22
а чтобы перевести char в последовательность бит надо просто разложить этот чар на биты.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
jonik_Dk
Дата 27.4.2004, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 18.2.2004

Репутация: нет
Всего: 1



Есть компоненты AsyncPro для работы с портами.
PM MAIL   Вверх
Pathfider
Дата 15.10.2004, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.7.2004
Где: все там же

Репутация: нет
Всего: 1



Цитата
if ReadFile(hCom, rByte, NumberOfBytesToRead, NumberOfBytesRead, @READOVERLAPPED) then

У меня на этой строчке выскакивает "'Ошибка чтения из порта!". Что делать?
--------------------
Trust is a weakness
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.