Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.02.2011, 12:21
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию COM-порт, модем, Delphi

Всем добрый день. Писала программу, которая обращается к ком-порту с командами ATH0/ATH1, чтобы светодиод, подключенный к модемному разъему, выключался/включался. Цепочка спаяна, проверена на скачанной из интернета программе. Работает. Вывод -- моя программа гг. Подскажите, пожалуйста, что не так, ибо совсем еще новичок.
Код:
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Port:THandle;
  TRBuf:PChar;
nToWrite:DWord;
nWrite:DWord;
 
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
begin
if  button1.Caption='Открыть' then
begin
  Port:=CreateFile(
    '\\.\COM3',
    GENERIC_READ or GENERIC_WRITE,
    0,                           
    nil,                         
    OPEN_EXISTING,               
    FILE_ATTRIBUTE_NORMAL,
    0
  );
 if (port=INVALID_HANDLE_VALUE)
  then Application.MessageBox('Не хочет он','Еррор',MB_OK)
  else begin
  Application.MessageBox('Порт открыт','Опен',MB_OK);
  button1.Caption:='Закрыть';
end;   end   else
if button1.Caption='Закрыть' then
begin
 
Application.MessageBox('Порт закрыт','Клозе',MB_OK);
CloseHandle (port);
button1.Caption:='Открыть';
 
end;
  end;
 
 
procedure TForm1.Button2Click(Sender: TObject);
 
begin
if  button1.Caption='Открыть'
then Application.MessageBox('Порт закрыт, откройте его!','Еррор',MB_OK) else begin
if  button2.caption='ATH0' then
begin
TRBuf:=PChar(button2.caption);
nToWrite:=length(TRBuf)+1;
WriteFile(port,TRBuf^,nToWrite,nWrite,nil);
 button2.caption:='ATH1';
 end else
 if  button2.caption='ATH1' then
 begin
TRBuf:=PChar(button2.caption);
nToWrite:=length(TRBuf)+1;
WriteFile(port,TRBuf^,nToWrite,nWrite,nil);
button2.caption:='ATH0';
 end;
end;
end;
 
end.
Ответить с цитированием
  #2  
Старый 06.02.2011, 14:54
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

1. А точно COM3?
2. Код ни фига не оптимальный, при желании его можно сократить в полтора раза.
3. Не нужно использовать глобальные переменные там, где не нужно.
4. Документация по этому делу есть?
[offtop]
5. Ник что-то не ассоциируется с аватором....
[/offtop]
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 06.02.2011, 15:10
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

1. Да точно, точно.
2. Спасибо за информацию.
3. В курсе, но так удобнее.
4. Какая именно?
5. Аватар изменить можно, а вот ник нет.
Пы.Сы.: ИМХО, у тебя получился полный оффтоп.
Ответить с цитированием
  #4  
Старый 06.02.2011, 20:20
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

4. А её много? Тогда вся, которая по теме
PS. Конечно, это же я
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 07.02.2011, 13:15
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Ты книжки имеешь в виду?
Если да, то книжки есть. Но такой специфической информации в них нет. По теме все, а я не флудераст =Р
Ответить с цитированием
  #6  
Старый 12.02.2011, 21:51
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Проблема не решена, программа не пашет, хотя и отправляет на порт такие же команды, что и скачанная программа. Кто-нибудь знает, как решить проблему?
Ответить с цитированием
  #7  
Старый 13.02.2011, 18:42
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

1 я бы сделал так (вставил бы выход из процедуры - помечено красным):
Код:
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Port:THandle;
  TRBuf:PChar;
nToWrite:DWord;
nWrite:DWord;
 
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
begin
if  button1.Caption='Открыть' then
begin
  Port:=CreateFile(
    '\\.\COM3',
    GENERIC_READ or GENERIC_WRITE,
    0,                           
    nil,                         
    OPEN_EXISTING,               
    FILE_ATTRIBUTE_NORMAL,
    0
  );
 if (port=INVALID_HANDLE_VALUE)
  then Application.MessageBox('Не хочет он','Еррор',MB_OK)
  else begin
  Application.MessageBox('Порт открыт','Опен',MB_OK);
  button1.Caption:='Закрыть';
<font color="RED">exit;</font>
end;   end   else
...
2 товарищ DJ PhoeniX правильно сомневается в номере порта, конечно если ваш момед не USB (в этом случае номер порта действительно не 1 или 2 - из-за установки виртуального COM'a)
3 чтобы быть уверенным в отправке/получении информации стоит посмотреть утилитой Руссиновича PORTMON
4 а где, собственно, настройки порта? может вашему момеду нужны нестандартные (дефолтовые) настройки порта (четность, стоповый бит, количество битов, скорость)
5 можете марку момеда назвать для большей определенности, ну или как-то иначе его идентифицировать - это по крайней мере уберет неясности в точности номера COM'a, да и предварительные настройки порта неплохо бы сделать вот вам в помощь, как раз синхронный режим работы с портом.
Ответить с цитированием
  #8  
Старый 14.02.2011, 20:15
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Выход из процедуры вставила-- не помогает.
Ком действительно третий...
Портмоном проверяла, именно поэтому в предыдущем посте я сказала, что моя программа не работает, хотя отправляет на порт такие же команды, что и скачанная программа. Agere systems HDA modem... Его как такового нет, вместо него подключена схема со светодиодом.
Ах да, последняя ссылка мне знакома -- пользовалась ей, когда писала программу)
Ответить с цитированием
  #9  
Старый 14.02.2011, 21:05
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

насколько я понимаю - работаете с момедом таким образом, что показатель работы есть диод на контактах гнезда под RJ11...
кстати, такой?.
думаю стоит посмотреть настройки порта, да и по коду, попробуйте сделать следующее (лучше отправку засунуть в функцию, результат которой boolean - успех отправки):
Код:
1
2
3
4
5
6
7
...
TRBuf:String[4];/// вместо PChar;
...
TRBuff:='ATH0';//<font color="red"><b>проверьте буквы в команде, чтобы не кирилица</b></font>
WriteFile(port,<font color="red">TRBuf[1],Length(TRBuf)</font>,nWrite,nil);
if nWrite=Length(TRBuf) then ShowMessage('OK') else ShowMessage('Error '+inttostr(GetLastError));// проверка правильности отправки синхронной работы
...
если говорит 'Error', то ищите ошибку в буфере отправки (TRBuf) - должга содержатся только текстовая информация (в вашем случае только 4 символа) без служебных символов


З.Ы. а может где контакт диода отошел или не в том направлении впаян?))))

Последний раз редактировалось cotseec, 14.02.2011 в 21:11.
Ответить с цитированием
  #10  
Старый 14.02.2011, 21:33
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Насчет модема--не знаю, честно.
Программу изменила, но светодиод не включается, хотя программа пишет ОК.
Насчет спайки--точно все в порядке, ибо скачанная программа работает.
Ответить с цитированием
  #11  
Старый 15.02.2011, 22:08
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Программу изменила, но светодиод не включается, хотя программа пишет ОК.
получается, что в порт данные отправляются, но момед их не обрабатывает или не понимает, остаются настройки порта, попробуйте на проверенном компоненте, хотя бы вот от сюда (с компонентом должна идти демка, которая поможет), чтобы понять в настройках ли дело и отсечь некорректность своего кода, может у вашей тестовой программы, которая зажигает диод, настройки порта не дефолтовые, если это так - в первую очередь попробуйте поиграться скоростью передачи, хотя судя по этому модем сам все делает.
и из области танцев с бубном - попробуйте после закрытия вашей программы, запустить работающую и наоборот, вместе попробовать тоже можно, но в какой-то программе должна случится ошибка открытия порта.
и перепишите вашу программу, без всяких заморочек с Caption кнопок, для начала отправляйте только одну команду 'ATH1' - поднятие трубки, т.к. на сколько я понимаю, 'ATH0' - положить трубку, т.е. разорвать цепь (следовательно диод и не горит).
Ответить с цитированием
  #12  
Старый 24.02.2011, 20:45
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Спасибо всем за помощь, разобралась.
оказывается, в строке "TRBuf:=PChar(button2.caption); " нужно было добавить "+#13+#10", только и всего.
теперь все прекрасно работает.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:04.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025