Форум программистов, компьютерный форум CyberForum.ru

LPT порт, Ubuntu, code::blocks - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 20:58     LPT порт, Ubuntu, code::blocks #1
Итак, название темы говорит само за себя. Нужно в консольном приложении code::blocks под Ubuntu читать и писать данные из/в LPT-порт. Если точнее, нужно не просто передать информацию, а "дергать пины". Да, я знаю, что уже это спрашивал, но тогда как обычно про тему все забыли, пришлось новую делать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 20:58     LPT порт, Ubuntu, code::blocks
Посмотрите здесь:

C++ watch в code::blocks
C++ не запускается в code blocks 8.0
C++ Code::Blocks IDE для ubuntu
Не компилируется в Code::Blocks C++
не компилит code blocks C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dr_Quake
Заблокирован
07.06.2013, 21:18     LPT порт, Ubuntu, code::blocks #2
"Дёргают пины" в LPT всегда одним способом - выводя нужный байт и битовые маски для пинов в байте собственно.
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 21:21  [ТС]     LPT порт, Ubuntu, code::blocks #3
Это собственно я и так понял. Я не понял как конкретно это все запилить на C++. Надо писать в какой-то файл по одному символу, ждать пока устройство не окажется готовым снова принимать данные и снова байт. Я не понял в какой файл записывать и из какого читать
Dr_Quake
Заблокирован
07.06.2013, 21:39     LPT порт, Ubuntu, code::blocks #4
В LPT нету никакого понятия готово-не готово(для SPP естественно,остальные режимы не везде есть и не подходят для такого режима работы с выводом на уровне 8 цифровых линий, ибо там подразумевается уже алгоритм и обмен двухсторонний). В линухе же есть блочное устройство(ppc если не ошибаюсь для linux 2.x), у него локи итд стандартные, но как и везде - там ещё есть ioctl для устройства, насколько знаю и через него можно напрямую выводить данные, ну и на ring0 прямо в порт по адресу.

Это достаточно старый пример(так работать скоро должны запретить через out), но вроде на 2.6 ещё работал. Байт по битмаске уже сам сформируешь.
http://eagerfish.eu/lpt-programming-...-ubuntu-linux/
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 22:07  [ТС]     LPT порт, Ubuntu, code::blocks #5
Спасибо, я немного переписал, покороче... Работоспособность неизвестна, сейчас проверять буду.
Вот код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <stdio.h>
#include <sys/io.h> //ioperm and outb
 
#define BASEPORT 0x378 //LPT adress
using namespace std;
 
int main()
{
    int j;
    if(ioperm(BASEPORT,3,1))
    {
        cout<<"Access denied!"<<endl;
        return 0;
    }
    for(;;)
    {
        cout<<"Access granted!"<<endl;
        outb(255,BASEPORT);
        for(j=0;j<250000;j++);
        outb(0,BASEPORT);
        for(j=0;j<250000;j++);
    }
    return(0);
}
Dr_Quake
Заблокирован
07.06.2013, 22:38     LPT порт, Ubuntu, code::blocks #6
А вот с поддержанием уже будут проблемы. Придётся скорее всего отдельный поток делать который держит порт, но через out не прокатит ни монополизация, ни проверка состояния, только писать туда что надо каждую секунду в отдельном потоке.
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 22:43  [ТС]     LPT порт, Ubuntu, code::blocks #7
Цитата Сообщение от Dr_Quake Посмотреть сообщение
А вот с поддержанием уже будут проблемы. Придётся скорее всего отдельный поток делать который держит порт, но через out не прокатит ни монополизация, ни проверка состояния, только писать туда что надо каждую секунду в отдельном потоке.
Так. А можно на более конкретных примерах? Я пока с потоками /*и еще много с чем*/ не разбирался. Совсем.
Dr_Quake
Заблокирован
07.06.2013, 22:46     LPT порт, Ubuntu, code::blocks #8
Конкретнее - если чему-то захочется в этот порт что-то записать из другого процесса параллельно - он это сделает спокойно, и возникнет каша из состояний вида кто быстрее дёргает outb. Плюс во время загрузки ядра линуха в дефолте пройдёт probing устройств и там тоже будет кратковременное псевдослучайное состояние.
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 23:07  [ТС]     LPT порт, Ubuntu, code::blocks #9
Цитата Сообщение от Dr_Quake Посмотреть сообщение
Конкретнее - если чему-то захочется в этот порт что-то записать из другого процесса параллельно - он это сделает спокойно, и возникнет каша из состояний вида кто быстрее дёргает outb. Плюс во время загрузки ядра линуха в дефолте пройдёт probing устройств и там тоже будет кратковременное псевдослучайное состояние.
Да, это плохо. Хорошо что сигнал будет ловиться МК а не транзисторами и можно посылать коды проверки... А как блокировать порт чтобы от подобного избавиться? Вернее, все регистры порта. Ошибки будут использоваться в качестве прерывателей.
Dr_Quake
Заблокирован
07.06.2013, 23:56     LPT порт, Ubuntu, code::blocks #10
Под линух не знаю. Разве что делать cat setofbytes.file > /device(из программы соответственно ioctl/fnctl/fwrite тупо) , тогда лочит на время записи. Но и тормозит при том... non-irq же, напрямую через irq никогда под линух не работал, и то насколько помню только не SPP с IRQ работает. Банально права выставить не спасёт от случайного запуска копии процесса.
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
08.06.2013, 13:06  [ТС]     LPT порт, Ubuntu, code::blocks #11
То есть все накрылось... Процесс будет запускаться из консоли, если нужно то через sudo, тут особых проблем нет. Насчет подтверждения то оно работает по ноге busy, мк ест один байт, подает сигнал что занят (обрабатывает байт), затем снимает и ждет дальше. Когда буфер заполнится или придет символ конца строки, он начинает активно работать, при этом все время работы держит сигнал что занят. Еще бы узнать символ конца файла и как все же закрыть всем доступ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 14:34     LPT порт, Ubuntu, code::blocks
Еще ссылки по теме:

C++ Компиляция в Code Blocks
Ubuntu + code:blocks + cUrl C++
Sfml на code::blocks C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dr_Quake
Заблокирован
08.06.2013, 14:34     LPT порт, Ubuntu, code::blocks #12
Я же пишу - попробуй работать с блочным устройством Linux, а не через порты, сразу и locking open появится. Но там будут ограничено доступны контрольные сигналы, для SPP вроде некритично.

http://stackoverflow.com/questions/6...-a-device-in-c
Yandex
Объявления
08.06.2013, 14:34     LPT порт, Ubuntu, code::blocks
Ответ Создать тему
Опции темы

Текущее время: 20:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru