это песня длинная. я приведу пример кода из рабочего проекта, там будет куча всяких констант и пр. мути, но самое главное (как открыть порт, настроить, прочитать, записать) ты там увидишь.по крайней мере, саму логику.
| Код | 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 в последовательность бит надо просто разложить этот чар на биты. |