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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
#1

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

07.06.2013, 20:58. Просмотров 1927. Ответов 11
Метки нет (Все метки)

Итак, название темы говорит само за себя. Нужно в консольном приложении code::blocks под Ubuntu читать и писать данные из/в LPT-порт. Если точнее, нужно не просто передать информацию, а "дергать пины". Да, я знаю, что уже это спрашивал, но тогда как обычно про тему все забыли, пришлось новую делать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 20:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос LPT порт, Ubuntu, code::blocks (C++):

Ubuntu + code:blocks + cUrl - C++
Здравствуйте, решил попробовать на с++ разработать приложение, которое будет работать с библиотекой cURL ОС = убунту, компилятор =...

Code::Blocks IDE для ubuntu - C++
Поставил ubuntu. Скачал IDE... Подскажите как добавить библиотеку. Нет conio.h Пишу на C++. Это библиотека С? Может в этом проблема?

Code::Blocks - C++
В Code::Blocks когда ты откомпилил программу в Debug, после внес изменения и снова "откомпилил", то нет результата от 2-й компиляции -...

Code::blocks - C++
Помогите как включить #include <graphics.h> #include <windows.h> в Code::block - се ,

Code::blocks и VS - C++
всем привет, у меня такой вопрос: какой в Code::blocks аналог для #include stdafx.h? Нужно запустить, операции использую для этой...

Code::Blocks - C++
Здравствуйте. Я в английском не силён, и разобраться самостоятельно с этой IDE не могу. У меня есть несколько вкладок с открытыми *.cpp...

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

Это достаточно старый пример(так работать скоро должны запретить через out), но вроде на 2.6 ещё работал. Байт по битмаске уже сам сформируешь.
http://eagerfish.eu/lpt-programming-example-in-c-for-ubuntu-linux/
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 22:07  [ТС] #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);
}
0
Dr_Quake
Заблокирован
07.06.2013, 22:38 #6
А вот с поддержанием уже будут проблемы. Придётся скорее всего отдельный поток делать который держит порт, но через out не прокатит ни монополизация, ни проверка состояния, только писать туда что надо каждую секунду в отдельном потоке.
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 22:43  [ТС] #7
Цитата Сообщение от Dr_Quake Посмотреть сообщение
А вот с поддержанием уже будут проблемы. Придётся скорее всего отдельный поток делать который держит порт, но через out не прокатит ни монополизация, ни проверка состояния, только писать туда что надо каждую секунду в отдельном потоке.
Так. А можно на более конкретных примерах? Я пока с потоками /*и еще много с чем*/ не разбирался. Совсем.
0
Dr_Quake
Заблокирован
07.06.2013, 22:46 #8
Конкретнее - если чему-то захочется в этот порт что-то записать из другого процесса параллельно - он это сделает спокойно, и возникнет каша из состояний вида кто быстрее дёргает outb. Плюс во время загрузки ядра линуха в дефолте пройдёт probing устройств и там тоже будет кратковременное псевдослучайное состояние.
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
07.06.2013, 23:07  [ТС] #9
Цитата Сообщение от Dr_Quake Посмотреть сообщение
Конкретнее - если чему-то захочется в этот порт что-то записать из другого процесса параллельно - он это сделает спокойно, и возникнет каша из состояний вида кто быстрее дёргает outb. Плюс во время загрузки ядра линуха в дефолте пройдёт probing устройств и там тоже будет кратковременное псевдослучайное состояние.
Да, это плохо. Хорошо что сигнал будет ловиться МК а не транзисторами и можно посылать коды проверки... А как блокировать порт чтобы от подобного избавиться? Вернее, все регистры порта. Ошибки будут использоваться в качестве прерывателей.
0
Dr_Quake
Заблокирован
07.06.2013, 23:56 #10
Под линух не знаю. Разве что делать cat setofbytes.file > /device(из программы соответственно ioctl/fnctl/fwrite тупо) , тогда лочит на время записи. Но и тормозит при том... non-irq же, напрямую через irq никогда под линух не работал, и то насколько помню только не SPP с IRQ работает. Банально права выставить не спасёт от случайного запуска копии процесса.
0
k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
08.06.2013, 13:06  [ТС] #11
То есть все накрылось... Процесс будет запускаться из консоли, если нужно то через sudo, тут особых проблем нет. Насчет подтверждения то оно работает по ноге busy, мк ест один байт, подает сигнал что занят (обрабатывает байт), затем снимает и ждет дальше. Когда буфер заполнится или придет символ конца строки, он начинает активно работать, при этом все время работы держит сигнал что занят. Еще бы узнать символ конца файла и как все же закрыть всем доступ...
0
Dr_Quake
Заблокирован
08.06.2013, 14:34 #12
Я же пишу - попробуй работать с блочным устройством Linux, а не через порты, сразу и locking open появится. Но там будут ограничено доступны контрольные сигналы, для SPP вроде некритично.

http://stackoverflow.com/questions/6...-a-device-in-c
0
08.06.2013, 14:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 14:34
Привет! Вот еще темы с ответами:

MS VS in CODE BLOCKS - C++
Делал проекты в VISUAL C++ EXPRESS. Сеичас пересел на LINUX, пользуюсь CODE BLOCKS . Есть какие-нибудь варианты как открыть проекты...

code::blocks 10.05 - C++
Я установил себе C++ code::blocks. И когда я компилирую любую программу и потом запускаю .exe выдаёт ошибку не находит libstdc++-6.dll. Я...

И снова LPT порт и все вытекающие - C++
Собственно, проблема: на компе нужно заюзать LPT-порт в качестве банального IO. Грубо говоря: управление схемой (всякие там светодиоды,...

Libcurl code blocks - C++
Уже вторые сутки пытаюсь установить библиотеку curl, но перерыв кучу материала в интернете так и не смог найти толкового гайда по...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru