Порты
Ниже представлен класс для работы с COM-портом. Класс выдернут из контекста, так что не ручаюсь в компиляции с первого раза, однако все функции работы с COM очевидны.
- Подробности
- Родительская категория: Работа с железом
- Категория: Порты
Code: |
unit TestRosh;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; PortCombo: TComboBox; Label2: TLabel; BaudCombo: TComboBox; Label3: TLabel; ByteSizeCombo: TComboBox; Label4: TLabel; ParityCombo: TComboBox; Label5: TLabel; StopBitsCombo: TComboBox; Label6: TLabel; Memo1: TMemo; Edit1: TEdit; Button1: TButton; Memo2: TMemo; Edit2: TEdit; Label7: TLabel; Button2: TButton; Label8: TLabel; Edit3: TEdit; procedure Button1Click(Sender: TObject); procedure Memo2Change(Sender: TObject); procedure Memo1Change(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); procedure PortComboChange(Sender: TObject); procedure FormShow(Sender: TObject); procedure Memo1DblClick(Sender: TObject); end;
var Form1: TForm1;
implementation
{$R *.DFM}
uses Registry;
var hPort: THandle;
procedure TForm1.Memo1Change(Sender: TObject); var i: Integer; begin Edit1.Text := ''; for i := 1 to Length(Memo1.Text) do Edit1.Text := Edit1.Text + Format('%x', [Ord(Memo1.Text[i])]) + ' ' end;
procedure TForm1.Memo2Change(Sender: TObject); var i: Integer; begin Edit2.Text := ''; for i := 1 to Length(Memo2.Text) do Edit2.Text := Edit2.Text + Format('%x', [Ord(Memo2.Text[i])]) + ' ' end;
procedure TForm1.Button1Click(Sender: TObject); var S, D: array[0..127] of Char; actual_bytes: Integer; DCB: TDCB; begin
FillChar(S, 128, #0); FillChar(D, 128, #0);
DCB.DCBlength := SizeOf(DCB);
if not GetCommState(hPort, DCB) then begin ShowMessage('Can not get port state: ' + IntToStr(GetLastError)); Exit; end;
try DCB.BaudRate := StrToInt(BaudCombo.Text); except BaudCombo.Text := IntToStr(DCB.BaudRate); end;
try DCB.ByteSize := StrToInt(ByteSizeCombo.Text); except ByteSizeCombo.Text := IntToStr(DCB.ByteSize); end;
if ParityCombo.ItemIndex > -1 then DCB.Parity := ParityCombo.ItemIndex else ParityCombo.ItemIndex := DCB.Parity;
if StopBitsCombo.ItemIndex > -1 then DCB.StopBits := StopBitsCombo.ItemIndex else StopBitsCombo.ItemIndex := DCB.StopBits;
if not SetCommState(hPort, DCB) then begin ShowMessage('Can not set new port settings: ' + IntToStr(GetLastError)); Exit; end;
PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
StrPCopy(S, Memo1.Text);
if not WriteFile(hPort, S, StrLen(S), actual_bytes, nil) then begin ShowMessage('Can not write to port: ' + IntToStr(GetLastError)); Exit; end;
if not ReadFile(hPort, D, StrToInt(Edit3.Text), actual_bytes, nil) then ShowMessage('Can not read from port: ' + IntToStr(GetLastError)) else ShowMessage('Read ' + IntToStr(actual_bytes) + ' bytes'); Memo2.Text := D; end;
procedure TForm1.FormDestroy(Sender: TObject); begin with TRegistry.Create do begin OpenKey('Shkila', True); WriteString('Port', PortCombo.Text); WriteString('Baud Rate', BaudCombo.Text); WriteString('Byte Size', ByteSizeCombo.Text); WriteString('Parity', IntToStr(ParityCombo.ItemIndex)); WriteString('Stop Bits', IntToStr(StopBitsCombo.ItemIndex)); Destroy; end; if not CloseHandle(hPort) then begin ShowMessage('Can not close port: ' + IntToStr(GetLastError)); Exit; end; end;
procedure TForm1.Button2Click(Sender: TObject); begin hPort := CreateFile(PChar(PortCombo.Text), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hPort = INVALID_HANDLE_VALUE then ShowMessage('Can not open ' + PortCombo.Text + ': ' + IntToStr(GetLastError)) else Button2.Hide; end;
procedure TForm1.PortComboChange(Sender: TObject); begin FormDestroy(Sender); Button2.Show; end;
procedure TForm1.FormShow(Sender: TObject); begin with TRegistry.Create do begin OpenKey('Shkila', True); PortCombo.Text := ReadString('Port'); BaudCombo.Text := ReadString('Baud Rate'); ByteSizeCombo.Text := ReadString('Byte Size'); ParityCombo.ItemIndex := StrToInt(ReadString('Parity')); StopBitsCombo.ItemIndex := StrToInt(ReadString('Stop Bits')); Destroy; end; end;
procedure TForm1.Memo1DblClick(Sender: TObject); begin Memo1.Lines.Clear; Memo2.Lines.Clear; Edit1.Text := ''; Edit2.Text := ''; end;
end. |
- Подробности
- Родительская категория: Работа с железом
- Категория: Порты
Взаимодействие с мобильными телефонами
Вы, наверное, не раз видели или даже пользовались программами, которые отображают любую информацию о вашем телефоне. Сейчас вы узнаете, как самим сделать такую программу!
Для начала положим на форму Memo, CheckBox "Соединиться», кнопку «Послать команду», Edit.
- Подробности
- Родительская категория: Работа с железом
- Категория: Порты
Простой пример работы с последовательными портами.
Код содержит интуитивно понятные комментарии и строки на шведском языке,
нецелесообразные для перевода.
- Подробности
- Родительская категория: Работа с железом
- Категория: Порты
Автор Дмитрий Кузан, Известно что в компьютере очень много собрано различных устройств , возникает вопрос как операционная система общается с ними. Для этого и служит порт, то есть эта «дверь» через которую программа (операционная система) может управлять данным устройством (считывать данные, заносить их).Причем я разделяю порты на две категории (это чисто мое разделение) - порты общеизвестные (COM LPT) и порты внутренние ,служащие для связи с внутренними устройствами ЭВМ. 2.Некоторые правила для работы с портами Следует иметь в виду что при разработке программ для работы с портами следует учитывать следующие факторы :
- Подробности
- Родительская категория: Работа с железом
- Категория: Порты
Страница 2 из 2