![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Всем добрый день. Писала программу, которая обращается к ком-порту с командами ATH0/ATH1, чтобы светодиод, подключенный к модемному разъему, выключался/включался. Цепочка спаяна, проверена на скачанной из интернета программе. Работает. Вывод -- моя программа гг. Подскажите, пожалуйста, что не так, ибо совсем еще новичок.
Код:
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
|
||||
|
||||
|
1. А точно COM3?
2. Код ни фига не оптимальный, при желании его можно сократить в полтора раза. 3. Не нужно использовать глобальные переменные там, где не нужно. 4. Документация по этому делу есть? [offtop] 5. Ник что-то не ассоциируется с аватором.... [/offtop] |
|
#3
|
||||
|
||||
|
1. Да точно, точно.
2. Спасибо за информацию. 3. В курсе, но так удобнее. 4. Какая именно? 5. Аватар изменить можно, а вот ник нет. Пы.Сы.: ИМХО, у тебя получился полный оффтоп. |
|
#4
|
||||
|
||||
|
4. А её много? Тогда вся, которая по теме
![]() PS. Конечно, это же я ![]() |
|
#5
|
||||
|
||||
|
Ты книжки имеешь в виду?
Если да, то книжки есть. Но такой специфической информации в них нет. По теме все, а я не флудераст =Р |
|
#6
|
||||
|
||||
|
Проблема не решена, программа не пашет, хотя и отправляет на порт такие же команды, что и скачанная программа. Кто-нибудь знает, как решить проблему?
|
|
#7
|
||||
|
||||
|
1 я бы сделал так (вставил бы выход из процедуры - помечено красным):
Код:
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:='Закрыть';
exit;
end; end else
...3 чтобы быть уверенным в отправке/получении информации стоит посмотреть утилитой Руссиновича PORTMON 4 а где, собственно, настройки порта? может вашему момеду нужны нестандартные (дефолтовые) настройки порта (четность, стоповый бит, количество битов, скорость) 5 можете марку момеда назвать для большей определенности, ну или как-то иначе его идентифицировать - это по крайней мере уберет неясности в точности номера COM'a, да и предварительные настройки порта неплохо бы сделать вот вам в помощь, как раз синхронный режим работы с портом. |
|
#8
|
||||
|
||||
|
Выход из процедуры вставила-- не помогает.
Ком действительно третий... Портмоном проверяла, именно поэтому в предыдущем посте я сказала, что моя программа не работает, хотя отправляет на порт такие же команды, что и скачанная программа. Agere systems HDA modem... Его как такового нет, вместо него подключена схема со светодиодом. Ах да, последняя ссылка мне знакома -- пользовалась ей, когда писала программу) |
|
#9
|
||||
|
||||
|
насколько я понимаю - работаете с момедом таким образом, что показатель работы есть диод на контактах гнезда под RJ11...
кстати, такой?. думаю стоит посмотреть настройки порта, да и по коду, попробуйте сделать следующее (лучше отправку засунуть в функцию, результат которой boolean - успех отправки): Код:
...
TRBuf:String[4];/// вместо PChar;
...
TRBuff:='ATH0';//проверьте буквы в команде, чтобы не кирилица
WriteFile(port,TRBuf[1],Length(TRBuf),nWrite,nil);
if nWrite=Length(TRBuf) then ShowMessage('OK') else ShowMessage('Error '+inttostr(GetLastError));// проверка правильности отправки синхронной работы
...З.Ы. а может где контакт диода отошел или не в том направлении впаян?)))) Последний раз редактировалось cotseec, 14.02.2011 в 21:11. |
|
#10
|
||||
|
||||
|
Насчет модема--не знаю, честно.
Программу изменила, но светодиод не включается, хотя программа пишет ОК. Насчет спайки--точно все в порядке, ибо скачанная программа работает. |
|
#11
|
||||
|
||||
|
Цитата:
и из области танцев с бубном - попробуйте после закрытия вашей программы, запустить работающую и наоборот, вместе попробовать тоже можно, но в какой-то программе должна случится ошибка открытия порта. и перепишите вашу программу, без всяких заморочек с Caption кнопок, для начала отправляйте только одну команду 'ATH1' - поднятие трубки, т.к. на сколько я понимаю, 'ATH0' - положить трубку, т.е. разорвать цепь (следовательно диод и не горит). |
|
#12
|
||||
|
||||
|
Спасибо всем за помощь, разобралась.
оказывается, в строке "TRBuf:=PChar(button2.caption); " нужно было добавить "+#13+#10", только и всего. теперь все прекрасно работает. |