Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Delphi & Com порт


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

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

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 в последовательность бит надо просто разложить этот чар на биты.

Автор: jonik_Dk 27.4.2004, 10:33
Есть компоненты AsyncPro для работы с портами.

Автор: Pathfider 15.10.2004, 20:29
Цитата
if ReadFile(hCom, rByte, NumberOfBytesToRead, NumberOfBytesRead, @READOVERLAPPED) then

У меня на этой строчке выскакивает "'Ошибка чтения из порта!". Что делать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)