Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2013, 13:03   #1
Zadovatel
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 46
По умолчанию [?]Cport 3.1 и COM порты в общем

Всем привет.Краткая предистория.Программированием занимался года 4 назад,но очень активно.Сейчас потребовалось написать софтинку для работы с AT командами.С COM портами никогда до этого не работал.Прочитал уйму материала по работе с COM портами,но к сожалению большинство из них написаны под WinAPI.Писать на WinAPI совсем не хочется,так как предстоит очень большой проэкт(по моим меркам) и тогда получу тонну кода...Я был бы крайне признателен за простенький пример.Открыть com порт под номером N,выставить все требующиеся минимальные настройки(какие?),записать в него строку "AT",считать ответ и записать его в текстовый фаил.Мой вариант,увы,не заработал.Вот пример:
Код:
procedure Treceiver.Execute;
Var
ComPort1:TCustomComPort;
Str: string;
f:System.Text;
begin
 GetComQuantity;
 ComPort1.Port := 'COM5';
 ComPort1.Timeouts.ReadInterval := 50;
 ComPort1.Open;
 ComPort1.WriteStr('AT');
 ComPort1.ReadStr(Str, 5);
 ComPort1.Close;
 AssignFile(f,'C:\Program Files\1.txt'); //регистрация файла
 Rewrite(f); //создание файла, если он там есть, то перезаписываеться (старый удаляеться, новый пустой появляеться)
 WriteLn(f,Str); //записываем строку в файл с переводом курсора на новую строку
 CloseFile(f); //закрываем файл
  { Place thread code here }
end;
Zadovatel вне форума Ответить с цитированием
Старый 25.08.2013, 13:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Мой вариант,увы,не заработал
А как определил что не заработал? Ошибки в ходе работы были?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2013, 13:25   #3
Zadovatel
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 46
По умолчанию

Компилируется все без ошибок.А вот текстовый фаил не создается.Сам компонент поставил прямо,так как при помощи него удалось записать в фаил список com портов.Здесь конечно может быть проблема с AT командой,но скорее всего я либо не правильно работаю с портом,либо накосячил с данными.
Zadovatel вне форума Ответить с цитированием
Старый 25.08.2013, 13:44   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Во-первых почему ComPort1:TCustomComPort, а не ComPort1:TComPort?
Во-вторых где его создание типа
Код:
ComPort1:=TComPort.Create();
?
northener вне форума Ответить с цитированием
Старый 25.08.2013, 14:17   #5
Zadovatel
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Во-первых почему ComPort1:TCustomComPort, а не ComPort1:TComPort?
Во-вторых где его создание типа
Код:
ComPort1:=TComPort.Create();
?
Большое спасибо за поправку с классом и напоминание про конструктор.Поправил,но результатов не дало.
Код:
procedure Treceiver.Execute;
Var
ComPort1:TComPort;
Str:string;
f:System.Text;
begin
 GetComQuantity;
 ComPort1 := TComPort.Create(ComPort1);
 ComPort1.Port := 'COM5';
 ComPort1.Timeouts.ReadInterval := 50;
 ComPort1.Open;
 ComPort1.WriteStr('AT');
 ComPort1.ReadStr(Str, 5);
 ComPort1.Close;
 AssignFile(f,'C:\Program Files\1.txt'); //ðåãèñòðàöèÿ ôàéëà
 Rewrite(f); //ñîçäàíèå ôàéëà, åñëè îí òàì åñòü, òî ïåðåçàïèñûâàåòüñÿ (ñòàðûé óäàëÿåòüñÿ, íîâûé ïóñòîé ïîÿâëÿåòüñÿ)
 WriteLn(f,Str); //çàïèñûâàåì ñòðîêó â ôàéë ñ ïåðåâîäîì êóðñîðà íà íîâóþ ñòðîêó
 CloseFile(f); //çàêðûâàåì ôàéë
  { Place thread code here }
end;
Zadovatel вне форума Ответить с цитированием
Старый 25.08.2013, 15:15   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1- если шлете строку, то и заканчивать ее нужно +#$D#$A
2- просто слать AT нельзя, это префикс-начало, слали б уже 'AT?' для проверки поддержки AT модемом
3- кто ж сразу после записи читает без ожидания? Модем не обязан мгновенно отрабатывать команды. Читайте в потоке постоянно, если не умеете работать с событиями приема обертки TComPort, а ведь на него есть справка. Да даже без справки можно было б полюбопытствовать событиями обертки и ее генофонда.

Цитата:
procedure Treceiver.Execute;
и на кой он в потоке? А если уж в потоке, то кто подчищать память будет после постоянного создания TComPort.Create?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 25.08.2013, 16:18   #7
Zadovatel
Пользователь
 
Регистрация: 25.08.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
1- если шлете строку, то и заканчивать ее нужно +#$D#$A
2- просто слать AT нельзя, это префикс-начало, слали б уже 'AT?' для проверки поддержки AT модемом
3- кто ж сразу после записи читает без ожидания? Модем не обязан мгновенно отрабатывать команды. Читайте в потоке постоянно, если не умеете работать с событиями приема обертки TComPort, а ведь на него есть справка. Да даже без справки можно было б полюбопытствовать событиями обертки и ее генофонда.

и на кой он в потоке? А если уж в потоке, то кто подчищать память будет после постоянного создания TComPort.Create?
Вопрос по первому пункту.Что означают эти символы?Так сказать что значит "заканчивать строку".Был бы рад за ссылку на статью.
Комментарий по второму пункту.В устройстве не стандартные AT команды и как следствие - другой синтаксис.К примеру,AT? машина не воспринимает,зато просто AT кушает на ура.
По третьему пункту.Полностью согласен про алгоритм запись/чтения.Просто я думал,что установка таймаутов решает эту проблему.Если это не так,то не могли бы Вы привести пример.Прокоментирую справку.Я не программил уже около 4х лет и все приходится заново вспоминать,по этому той узконаправленной справка,которая прилагается для меня не достаточно.Вроде разобрался.Проблема была в конструкторе(нужно было в качестве параметра задать нулевой указатель).

Еще вопрос.Корректно-ли такой конструкцией проверять открыт-ли порт?
Код:
ComPort1.Open;
 if ComPort1.Connected
   then
    Str:='open'
   else
    Str:='closed';
 ComPort1.Close;
Как ведет себя Open.Если не удалось открыть порт,то она все равно устанавливает флаг или нет?
Zadovatel вне форума Ответить с цитированием
Старый 25.08.2013, 17:04   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что означают эти символы?
$d $a это в 16-тиричной кодировке цифры 13 и 10.
13 это код клавиши энтер (перевод каретки в начало строки), а 10 это кажись код перехода на новую строку.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2013, 18:53   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Zadovatel Посмотреть сообщение
Писать на WinAPI совсем не хочется
Тогда возьмите другой компонент для работы с СОМ-портом.

Мой личный совет Async Pro
northener вне форума Ответить с цитированием
Старый 25.08.2013, 19:26   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
В устройстве не стандартные AT команды
тогда прежде, чем спрашивать совета на форуме по работе с "устройством" следует озвучить название этого устройства в теме.

Да, для терминалов разных производителей AT-команды могут отличаться, но стандарт един. Вы гипертерминалом пробовали работать со своим устройством, отвечает на команды? Так если отвечает, обратите внимание на то, как вы отсылаете свои команды и чем завершаете. Это уже ответил Stilet.

Цитата:
Как ведет себя Open.Если не удалось открыть порт,то она все равно устанавливает флаг или нет?Оно в нем на команды отвечает?
генофонд модуля даст ответ, кнопка CTR + ENTER на нужном методе.

Цитата:
Полностью согласен про алгоритм запись/чтения.Просто я думал,что установка таймаутов решает эту проблему.
таймаут при мгновенном чтении после записи не играет роли.

Цитата:
Проблема была в конструкторе(нужно было в качестве параметра задать нулевой указатель).
проблема в том (и это не основная проблема), что вы в потоке постоянно плодите объекты, не удаляя их.

Цитата:
Тогда возьмите другой компонент для работы с СОМ-портом.
какая разница какой он компонент возьмет, если он не знает как с ними обращаться в потоках и вообще они тут не к месту, у компонента своя нить.

http://programmersforum.ru/showpost....40&postcount=9
http://programmersforum.ru/showthread.php?t=108961
http://programmersforum.ru/showthread.php?t=87672
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работать с компонентом CPort Yrok Компоненты Delphi 27 27.06.2012 10:02
Перевод в постфиксную форму в общем случае. Lasur Помощь студентам 1 17.03.2012 09:16
Компонент CPort ? z-wer Компоненты Delphi 1 29.06.2011 08:51
Автосохранение книги в общем доступе Chelentano Microsoft Office Excel 0 25.08.2009 13:10