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

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

Сложность в том, что в 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 » 

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