![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Dapo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 18.4.2002 Репутация: нет Всего: 1 |
С портами начал работать недавно. Вот код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Memo1: TMemo; Edit2: TEdit; Memo2: TMemo; Button4: TButton; Button5: TButton; Edit3: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; DCB:TDCB; hPort:THandle; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin hPort:=CreateFile(PChar(Edit1.Text),GENERIC_READ or GENERIC_WRITE,0,Nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if hPort=INVALID_HANDLE_VALUE then ShowMessage('Не могу открыть порт!') else ShowMessage('Порт открыт'); end; procedure TForm1.Button2Click(Sender: TObject); begin if not CloseHandle(hPort) then ShowMessage('Не могу закрыть порт!') end; procedure TForm1.Button3Click(Sender: TObject); var actual_bytes:DWORD; S:array [0..127] of Char; D:array [0..127] of Char; begin FillChar(S, 128, #0); FillChar(D, 128, #0); StrPCopy(S, Edit3.Text); if not WriteFile(hPort,S,StrLen(S),actual_bytes,nil) then ShowMessage(IntToStr(GetLastError)) else if not ReadFile(hPort, D, StrToInt(Edit2.Text), actual_bytes, nil) then ShowMessage(IntToStr(GetLastError)) else begin ShowMessage('Прочитано '+IntTostr(actual_bytes)+' байт'); Memo1.Lines.Add('Прочитано '+D); end; end; procedure TForm1.Button4Click(Sender: TObject); begin DCB.DCBlength := SizeOf(DCB); if not GetCommState(hPort, DCB) then ShowMessage('Не могу прочитать настройку порта: ' + IntToStr(GetLastError)) else begin Memo2.Clear; Memo2.Lines.Add('Текущие настройки порта'); Memo2.Lines.Add('Boud rate - '+IntToStr(DCB.BaudRate)); Memo2.Lines.Add('Flags - '+IntToStr(DCB.Flags)); Memo2.Lines.Add('Byte size - '+IntToStr(DCB.ByteSize)); Memo2.Lines.Add('Parity - '+IntToStr(DCB.Parity)); Memo2.Lines.Add('Stop bits - '+IntToStr(DCB.StopBits)); end; end; end. Операция чтения из порта ReadFile - виснет в зависимости от указанного числа считываемых байтов. Если указать 2 то не висит, а если больше - то зависнет то нет. В Memo1 выводиться считанная информация (работаю с модемом и посылаю его родные AT-команды, например ATI3 - версия модема, модем отвечает) - получаю какую-то абракадабру. Увеличиваю число считываемых байтов - или висит или абракадабра. Помогите разобраться или хотябы инфу какую-нибудь. Пишу в Delphi 6, W2K Server. Спасибо. |
|||
|
||||
| VoL |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 26.3.2002 Репутация: нет Всего: нет |
Может попробуешь воспользоваться функцией, которая читает данные, только она на асме:
function PortIn(Port: Word): Byte; assembler; asm MOV DX,Port; IN AL,DX end И адреса COM портов: для 1:3F8h и для 2:2F8h |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |