Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 23.02.2009
Сообщений: 3
1

работа в delphi с СОМ-портом

23.02.2009, 19:57. Показов 7117. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,пишу программу на пипломник, суть программы: через COM-порт отправляет и принимает определенные команды (программа для работы с оборудованием мобильных операторов). Проблема: в процедуре formcreate когда доходит до подключения к порту и его настройки,процедура не выполняется,без ошибок и без вылетов все компилируется но к порту не подключается и не настраивает. КАК узнал: перед подключением и перед настройкой поставил вывод в label цифры,показало что перед подключением порта все встает и процедура дальше не выполняется. Подскажите есть ли какое нибуть решение,либо кто нибуть уже писал подобное,подскажите пожалуйста,вся работа встает из за этого.



код процедуры:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, ComCtrls, Menus, ExtCtrls, Buttons, Unit2;
 
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Label4: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Label3: TLabel;
Label5: TLabel;
Label7: TLabel;
UpDown1: TUpDown;
Edit1: TEdit;
UpDown2: TUpDown;
Edit2: TEdit;
Label8: TLabel;
Label6: TLabel;
MainMenu1: TMainMenu;
menu1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
FAQCU1: TMenuItem;
CU1: TMenuItem;
SaveDialog1: TSaveDialog;
Panel2: TPanel;
Memo1: TMemo;
RadioButton7: TRadioButton;
RadioButton8: TRadioButton;
RadioButton9: TRadioButton;
RadioButton10: TRadioButton;
RadioButton11: TRadioButton;
RadioButton12: TRadioButton;
Panel3: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
StatusBar1: TStatusBar;
Panel1: TPanel;
Timer1: TTimer;
PWRout: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure CU1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure clear1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
{ procedure Memo1Change(Sender: TObject);}
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
hCom,Errors,Bytes:Cardinal;
DCB:TDCB;
TheStruct:TCOMSTAT;
buffer:string;
s,p,f,w,e:string;
 
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
Memo1.Lines.Clear;
Memo1.Lines.Add('БС № '+(
InputBox('Начало работы','Введите БС №:','')+
' '+DateToStr(Now)+' '+TimeToStr(Now)));
{:: открытие порта ::}
hCom:=CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_N ORMAL,0);
if hCom=INVALID_HANDLE_VALUE then begin
//не удалось открыть
exit;
end;
SetupComm(hCom,1600,1600);
GetCommState(hCom,DCB);
//настроить нужным образом
Dcb.BaudRate := CBR_9600;
Dcb.Parity := NOPARITY;
Dcb.ByteSize := 8;
Dcb.StopBits := ONESTOPBIT;
if not SetCommState(hCom,DCB) then ShowMessage('ошибка')
else form1.StatusBar1.Panels.Items[0].Text:='соединение установлено';
 
Form1.ActiveControl:=Button2;
 
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2009, 19:57
Ответы с готовыми решениями:

Работа с модемом и СОМ портом Допоможите
Люди допоможите хто чем может! А по существу есть такая проблема. Необходимо сделать звонилку...

Работа с СОМ-портом через ЛВС
Здравствуйте господа. Мне предстоит следующая задача: в колхозе монтируются автомобильные весы на...

Работа с сом-портом
Есть прибор подключаемый через сом-порт и хотелось бы написать программу получения данных с помощью...

Работа с СОМ-портом
Пишу программу для работы с устройством через COM-порт. Я отсылаю устройству запрос так:...

2
0 / 0 / 0
Регистрация: 22.02.2009
Сообщений: 3
24.02.2009, 01:47 2
Есть компоненты для работы с COM портом. Писал и ручками, когда нужно было. Вот примерчик из одного проекта, правда писал это только когда начинал программить, но работало у меня как нужно, и с реальной железкой и виртуальными портами. Поизучай, если не разберёшься, то выкину пасник компонента, которым пользуюсь обычно. Этот пример просто легче понять.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, TabNotBk;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    CheckBox1: TCheckBox;
    TabbedNotebook1: TTabbedNotebook;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label8: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
 
    function OpenCOMPort: Boolean;
    function SetupCOMPort: Boolean; //для настройки порта
    procedure Connect;
    procedure Disconnect;
 
  end;
 
var
  Form1: TForm1;
        ComFile: THandle; //Хэндл создаваемого нами файла
        ComString: string; //(COM1, COM2 или COM3)
        ComSpeed: Integer; //Скорость взаимодействия с COM-портом
        Status: Boolean; //подключен или не подключен (чтобы в дальнейшем проверять статус)
 
 
 
implementation
 
{$R *.dfm}
 
 
 
procedure TForm1.Connect;
begin
  ComString := 'COM2';
  ComSpeed := 19200;
  if OpenCOMPort = true then //Открываем порт…
    if SetupCOMPort = true then //…и конфигурируем его
      Memo1.Lines.Add('Подключились...');
  Sleep(1500); //засыпаем на полторы секунды чтобы дать время на соединение
end;
 
procedure TForm1.Disconnect;
begin
  CloseHandle(ComFile);
  Memo1.Lines.Add('Отключились.');
end;
 
 
function TForm1.OpenCOMPort: Boolean;
var DeviceName: array[0..80] of Char;
  Device: string;
begin
  Device := ComString;
  StrPCopy(DeviceName, Device);
  ComFile := CreateFile(DeviceName,
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);
  if ComFile = INVALID_HANDLE_VALUE then
    begin
      Result := False;
      Status := Result;
    end
  else
    begin
      Result := True;
      Status := Result;
    end;
 
end;
 
function TForm1.SetupCOMPort: Boolean;
const RxBufferSize = 256;
      TxBufferSize = 256;
var   DCB: TDCB;
      Config: string;
      CommTimeouts: TCommTimeouts;
begin
  Result := True;
  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;
  if not GetCommState(ComFile, DCB) then
    Result := False;
 
  Config := 'baud=' + IntToStr(ComSpeed) + ' parity=n data=8 stop=1'; //Устанавливаем скорость
  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;
  if not SetCommState(ComFile, DCB) then
    Result := False;
 
  with CommTimeouts do
    begin
      ReadIntervalTimeout := 0;
      ReadTotalTimeoutMultiplier := 0;
      ReadTotalTimeoutConstant := 1000;
      WriteTotalTimeoutMultiplier := 0;
      WriteTotalTimeoutConstant := 1000;
    end;
  if not SetCommTimeouts(ComFile, CommTimeouts) then
    Result := False;
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
    BytesWritten: DWORD;
    s: string;
    d: array[1..1500] of Char;
    BytesRead: DWORD;
    i: Integer;
    Result: string;
 
begin
 
    s := 'Эти данные отправляем'; //Тут записываем нужные данны
    WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их устройству
    Result := '';
 
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
    begin
      MessageDlg('Ошибка чтения!', mtError, [mbOK], 0);
        exit;
    end;
 
  s := '';
  for i := 1 to BytesRead do //Считываем ответ
    s := s + d[I];
  Result := s;
  Memo1.Lines.Add(Result); //Выводим ответ от устройства в Memo
 
end;
 
 
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
    Connect
  else
    Disconnect;
end;
 
end.
0
0 / 0 / 0
Регистрация: 23.02.2009
Сообщений: 3
24.02.2009, 09:32  [ТС] 3
Спасибочки! Попробую отпишусь.
0
24.02.2009, 09:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2009, 09:32
Помогаю со студенческими работами здесь

Работа с СОМ портом
Для тех кто в танке то есть мой случай . Думаю можно отдельную тему вынести программирование СОМ...

Работа с сом-портом
Суть программы-обмен данными с некоторым микроконтроллером. Одна из особенностей- RX и TX...

Работа с СОМ портом, переполнение буфера
Написал программу на билдере для проверки работы одного девайса через СОМ порт. Программа...

Работа с СОМ портом (прием и передача)
Подскажите, ПОЖАЛУЙСТА! Хочу написать небольшую программку, которая должна отправлять на СОМ порт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru