Гражданская радиосвязь в России (CB, LPD, PMR) Вход     Регистрация

18+ Данный раздел сайта запрещён для просмотра детьми!  

Данный раздел запрещён для просмотра детьми

Материалы данного раздела могут содержать информацию, запрещенную для детей, согласно нормам установленным Федеральным законом "О защите детей от информации, причиняющей вред их здоровью и развитию".
Гражданская радиосвязь / Всё на форуме / Программирование: С, Arduino и другое - обсуждение, вопросы и ответы
Работа с LPT портом в FreeBSD # может на perl? // фигу, давай наСИлуй!
250 из Новосибирск - Новосибирская обл
250 из Новосибирск - Новосибирская обл
  Понимаю, сегодня ценность этого для общества ничтожна, но всё же, может кому ни будь послужит примером программирования на C под FreeBSD.

Собственно потребовалось мне устанавливать произвольные биты LPT порта на стареньком компьютере работающем под управлением FreeBSD.
Прево-наперво я решил попробовать сделать это на perl, соответственно код:
#!/usr/bin/perl
open (myLPTdescriptor,">/dev/ppi0") or die("Can't open LPT.\n");
binmode myLPTdescriptor;
print myLPTdescriptor "\xFF";
close myLPTdescriptor;
Фигу с дрыгой, не пошло.
И ошибок нет и результата в виде свечения светодиода на пинах LPT тоже нет.
Решил поискать модули нацеленные на работу с портами, нашел "Device::ParallelPort", поставил, попробовал простейший скрипт вида:
#!/usr/bin/perl
use Device::ParallelPort;
my $port = Device::ParallelPort->new();
print "1234\n";
Модуль выругался: "под FreeBSD я не в состоянии автоматически определить какой у вас LPT порт".
Хорошо, указал ручками: "/dev/ppi0"
Тут модуль сказал что в нём ошибка в строке 2 некого eval, а интернет подсказал, что модуль этот как и модуль "Device::SerialPort" под FreeBSD не работают и судя по нулевой реакции их автора на сообщениях о баге и работать не будут.
Напрямую не заработало, модулей нет, ладно, пусть будет на СИ!
В конце концов я что зря что ли C знаю и в perl есть метод вызова любой команды системы:
system("COMMAND");
Делать на 1 раз и для 1 задачи не хотелось, всё равно уже не один час был убит на потуги с модулями и прочим, да и спать уже не хотелось, так что написал нечто универсальное:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include </sys/dev/ppbus/ppi.h>

int main(int argc, char *argv[]){
int port_num,ppi_fd,temp0;
unsigned char data_byte_in,data_byte_to,state_byte_in,ctrl_byt­e_in,ctrl_byte_to;­
unsigned char portstr[256];
if (argc <3){
printf("-1 -1 -1 *** Usage: lptsr LPTPORTNUM FLAGTXTOUT[ CTRLBYTEINHEX[ DATABYTEINHEX]]\nLPTPORTNUM = 0 ... 9\nCTRLBYTEINHEX = 00 .. 1F or no arg.\nFLAGTXTOUT = 1 or 0 (1=out txt to stdout; 0=no out)\nIf arg present then: 1x = DATAREG line is out; 0x = DATAREG line is input.\nDATABYTEINHEX = 00 ... FF\nReturn format:\nDD SS CC ** Text info. Return exec status = DECIMALSTATUS+1\nDD = state DATAREG in HEX\nSS = state STATUSREG\nCC = state CTRLREG\nIf error operation:\n-1 -1 -1 ** Text error. Return exec status = 0\n");
return 0;
}
port_num=atoi(argv[1]);
if (port_num <0 || port_num >9){
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Invalid LPTPORTNUM.");}
return 0;
}

if (argc >3){
temp0=strlen(argv[3]);
if (temp0!=2){
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Invalid CTRLBYTEINHEX.");}
return 0;
}
sscanf(argv[3], "%02X", &ctrl_byte_to);

if (argc >4){
temp0=strlen(argv[4]);
if (temp0!=2){
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Invalid DATABYTEINHEX.");}
return 0;
}
sscanf(argv[4], "%02X", &data_byte_to);
}
}

sprintf(portstr, "/dev/ppi%u",port_num);
ppi_fd = open(portstr, O_RDWR);
if(ppi_fd < 0){
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Can't open port.\n");}
return 0;
}

temp0 = ioctl(ppi_fd, PPIGCTRL, &ctrl_byte_in);
if(temp0 < 0){
close(ppi_fd);
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Error read CTRLBYTE in PPIGCTRL.\n");}
return 0;
}
temp0 = ioctl(ppi_fd, PPIGSTATUS, &state_byte_in);
if(temp0 < 0){
close(ppi_fd);
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Error read PPIGSTATUS.\n");}
return 0;
}
temp0 = ioctl(ppi_fd, PPIGDATA, &data_byte_in);
if(temp0 < 0){
close(ppi_fd);
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Error read DATABYTE in PPIGDATA.\n");}
return 0;
}

if (argc >3){
temp0 = ioctl(ppi_fd, PPISCTRL, &ctrl_byte_to);
if(temp0 < 0){
close(ppi_fd);
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Error send CTRLBYTE to PPISCTRL.\n");}
return 0;
}
if (argc >4){
temp0 = ioctl(ppi_fd, PPISDATA, &data_byte_to);
if(temp0 < 0){
close(ppi_fd);
if (argv[2][0] == '1'){printf("-1 -1 -1 *** Error send DATABYTE to PPISDATA.\n");}
return 0;
}
}
}
close(ppi_fd);
if (argv[2][0] == '1'){printf("%02X %02X %02X *** OK.\n", data_byte_in, state_byte_in, ctrl_byte_in);}
return state_byte_in+1;
}
Компилировать:
1) Положить код в файл "lptsr.c"
2) Вбить в командную строку и выполнить:
gcc lptsr.c -lcrypto -o lptsr
В итоге получим файл "lptsr", который можно запустить без аргументов и прочитать как его использовать, или начать запускать с аргументами и получать результат.

И это, вот ещё что:
ДА ЧТО БЫ КОСТИ ЛОМИЛО ГОД У ТОГО, КТО НЕДОДЕЛАЛ НОРМАЛЬНУЮ ФИГНЮШКУ В perl ПОД FreeBSD ДЛЯ РАБОТЫ С LPT ПОРТАМИ, Я 8 ЧАСОВ ТРАХАЛ СЕБЕ МОЗГ ИЗ ЗА ПРОСТЕЙШИХ ВЕЩЕЙ КОТОРЫЕ В WINDOWS РЕШАЮТСЯ ОДНОЙ СТРОЧКОЙ В batch ФАЙЛЕ!!!
 
Записано: 1972 дн 20 час 43 мин 7 сек назад (10.01.2015, 05:03:17)



 
Ник:

Пароль к нику:

Число изображённое крупным шрифтом:


Написать комментарий:
[B] [I] [S] [WWW] [YouTube]

Бросить друзьям ссылку на тему:
Если это интересная тема, дайте людям на неё ссылку:
http://27kb.ru/zou.php?f=901&message=20926


О сайте
Правила сайта
  Обратная связь Рекламодателям
  Сотрудничество   Яндекс.Метрика