Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Perl и COM-порт  (Прочитано 30430 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« : 11-07-2007 11:53 » 

Меня интересует такой вопрос, как с помощью Perl-а работать с COM-портом и возможно ли это.
Нужно настраивать параметры порта (скорость передачи, количество битов в передоваемом байте, количество стоп-битов и т.п.).

P.S. Хочется написать такую программку которая считывала бы файл конфигурации и по нему открывала порт с описанными в нем параметрами. Ну и конечно же отправляла и читала данные. На 'C' не хочется писать, потому что времени много займет. А для Perl-а я что то не нащел как работать с COM-портами.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-07-2007 16:39 » 

Сложность в том, что в Unix, откуда родом Perl, последовательные порты доступны как файлы и работа с ними аналогична файлам, а в Win32 доступиться к ним сложнее.

Попробуй порыться на www.cpan.org

На С работать с послед.портом вовсе не сложно.
« Последнее редактирование: 11-07-2007 16:41 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-07-2007 05:10 » 

На С работать с послед.портом вовсе не сложно.
С портом работать не сложно. Но требуется что то типа простенького интерпритатора с простыми конструкциями (if, for и т.п.). Вот реализация этого на 'C' и займет основное время. Поэтому и хотелось для данного случая использовать Perl.

RXL, может Вы знаете где есть пример простого модуля (типа "Hello world") для Perl, написанного на 'C'?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 12-07-2007 05:31 » 

Serg79,
Цитата
Но требуется что то типа простенького интерпритатора с простыми конструкциями (if, for и т.п.).

зачем такие сложности , можно сделать формат файла конфигурации вида

"имя_параметра_1"=значение_параметра\r\n
"имя_параметра_7"=значение_параметра\r\n
"имя_параметра_20"=значение_параметра\r\n
"0"\r\n

нужный параметр найти - элементарно, ищем в файле подстрочку
\"имя_параметра\" ,
после неё ищем символ =, а всё после = и до \r\n - считываем в параметр.

что то вроде этого
Код:
//поиск в тексте pFileArray значения запрошенного параметра quoted_name
bool GetParamDWORD(
  const char* quoted_name,
  DWORD& dwdRetValue,
  const char* pFileArray)
{
int nameLen=strlen(quoted_name);

const char* p=0;

p=strstr(pFileArray,quoted_name);
if(!p)return false;

p=strstr(p+nameLen,"=");
if(!p)return false;

p++;

dwdRetValue=atoi(p);

return true;
}

quoted_name - это имя параметра, заключённое в кавычки
quoted_name = "\"параметр_1\"";
« Последнее редактирование: 12-07-2007 05:51 от Алексей1153++ » Записан

Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 12-07-2007 05:52 » 

С вводом параметров порта, проблем нет, конструкцию типа "BAUD = 4800;" разобрать не сложно.
Но дополнительно требуется разбирать записи такого типа: записать строку в порт, подождать 10 милисекунд, считать 2 байта, повторить 46 раз. Вот такая песня. Вот с этим можно довольно много времени потратить. Поэтому я и хочу написать модуль для Perl, который бы имел несколько элементарных функций: открыть порт, настроить порт, записать один символ, считать один символ. Я так думаю, по времени этот вариант получиться быстрее.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 12-07-2007 06:01 » 

понятно. Типа скрипта своего нужно. В принципе - день работы, если хорошо посидеть над этим )
можно для упрощения вложенные циклы не делать
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 12-07-2007 06:07 » 

Serg79, а тебе обязательно на perlе?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 12-07-2007 06:13 » 

Serg79, а тебе обязательно на perlе?
А я кроме 'C', 'C++', 'Perl' и 'Shell-а' больше ничего не знаю. Улыбаюсь Ну не счетая ассемблера.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 12-07-2007 06:48 » 

я думаю что должно быть типа такое (Tcl example)
Код:
open fileName
fconfigure -mode baud,parity,data,stop

Добавлено через 10 минут и 49 секунд:
на perl (я его не знаю)
возможно будет выглядеть так
Код:
open (/dev/ttyS1)

а дальше работать как с файлом
вот немножко нарыл в гугле
Код:
my $port;
open ($port, "+</dev/ttyS0") || die "cannot open port S0: $!\n";

# you will have to tweak this depending on your comm protocol
# my guess is that raw might do what you want

system("stty 9600 raw < /dev/ttyS0");
« Последнее редактирование: 12-07-2007 06:59 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 12-07-2007 07:01 » 

Мне надо это реализовать под Win32.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 12-07-2007 07:13 » 

ну дык?
думаю что вопросов не возникнет
как в с++ ты открываешь serial порт/файл? (я не помню синтаксис, но знаю что просто)
точно также и в перле


Добавлено через 5 минут и 59 секунд:
гляди сюда
гугль рулит
http://answers.tveasy.co.uk/c.l.p.misc/W-Serial-P.htm
http://search.cpan.org/~cook/Device-SerialPort-1.002001/SerialPort.pm
« Последнее редактирование: 12-07-2007 07:19 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 12-07-2007 15:52 » 

Serg79, тут можно взять модуль Win32::SerialPort:
http://www.cpan.org/modules/by-category/22_Microsoft_Windows_Modules/Win32/

Цитата
RXL, может Вы знаете где есть пример простого модуля (типа "Hello world") для Perl, написанного на 'C'?
Ты имеешь в виду, писать на С для Perl -  я так понял.
Об этом написано в книге Perl Programming (Программирование на языке Perl), издательство o'Reilly. Можно найти в электронном виде на английском или купить бумажную на русском.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 13-07-2007 04:01 » 

Serg79, тут можно взять модуль Win32::SerialPort:
http://www.cpan.org/modules/by-category/22_Microsoft_Windows_Modules/Win32/
Я не как ни пойму, как мне этот модуль прикрутить к Perl-у в Windows.  Здесь была моя ладья...
Дело в том, что утилита установки модулей "ppm" требует чтобы модули были с расширением "*.ppd", а Win32-SerialPort является архивом "tar.gz".
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 13-07-2007 07:29 » 

 а че в README разве не написано?

perl Install.PL

но сначала распаковать

Serg79, по большому счету кроме библиотек для работы перла в винде ничего не должно регистрироваться
а все остальное можно и "ручками" разбросать Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 13-07-2007 09:10 » 

Не, "Makefile.PL" в Win-де не прокатывает. Там помимо Perl-овских ".pm" необходимы и ".dll" в которых это все реализованно. Поэтому в винде и существует утилита "ppm" которая устанавливает и удаляет пакеты.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 13-07-2007 09:22 » new

Serg79, на сайте ActivePerl по этому поводу ничего не нет?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 13-07-2007 09:51 » 

Serg79, а ты уверен?
тебе нужен модуль

use Win32;
use Win32::API 0.01;

и он наверное идет в составе activeperl

ps. чего я сюда лезу? я аналогичной ситуацией сталкивался с тиклем, там такая же ситуация с дополнительными модулями

Добавлено через 2 минуты и 50 секунд:
и установи модули
Win32
Win32-API
« Последнее редактирование: 13-07-2007 09:54 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines