1 Востаннє редагувалося Bartash (23.06.2013 22:29:33)

Тема: Управління LPT портом*

Потрібно управляти LPT портом в BORLAND C + + 3.1
Підкажіть яким чином здійснювати введення і запис в порт інформації.

Написав такий шматок. Начебто без помилок, але сигнали на виході порту не з'являються. У чому може бути косяк?
   

#include <stdio.h>
#include <conio.h>
 
main()
 
{
 
         int data=255;
 
         outportb(0x378,data);
 
         getch();
 
}

Bartash: код слід брати у теги code.

2

Re: Управління LPT портом*

Якийсь захват форуму москалями!
RAFA

1.1. Мовою спілкування на форумі є українська. Якщо у вас з українською мовою проблема, ви можете використовувати будь-який російськомовний форум такої ж тематики.

Раджу як найшвидше українізувати питання, бо тема опиниться у кошику!

x

3 Востаннє редагувалося Chemist-i (23.06.2013 17:50:15)

Re: Управління LPT портом*

RAFA
Якщо не облом розбиратись - ось Вам прога:

Код проги

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include "h.h"

void WriteToDataRegister()
{    
  cout<<"Write data to DATA register.\n"<<endl;
  int b=0;    
  cout<<"Enter data: "<<endl;
  cin>>b;
  if (b<0||b>255) 
  cout<<"Error! You can take data only from diaposon 0-255."<<endl;
  else
  {
      Out32(888, b);
      cout<<"Write done.\n"<<endl;
  }
  cout<<"Press any key to back to Main menu..."<<endl;
  getch();
  system("cls");
}

void ReadDataRegister()
{    
  cout<<"Read data from DATA register.\n"<<endl;    

  int data;
  data = Inp32(888);
  cout<<"10: "<<data<<endl;

  char number[20];
  itoa(data,number,2);
  cout<<" 2: "<<number<<endl;

  cout<<"\nPress any key to back to Main menu..."<<endl;
  getch();
  system("cls");
}

void WriteToControlRegister()
{    
  cout<<"Write data to CONTROL register.\n"<<endl;
  int b=0;    
  cout<<"Enter data: "<<endl;
  cin>>b;
  if (b<0||b>16) 
  cout<<"Error! You can take data only from diaposon 0-16."<<endl;
  else
  {
      Out32(890, b);
      cout<<"Write done.\n"<<endl;
  }
  cout<<"Press any key to back to Main menu..."<<endl;
  getch();
  system("cls");
}

void ReadControlRegister()
{    
  cout<<"Read data from CONTROL register.\n"<<endl;    

  int data;
  data = Inp32(890);
  cout<<"10: "<<data<<endl;

  char number[20];
  itoa(data,number,2);
  cout<<" 2: "<<number<<endl;

  cout<<"\nPress any key to back to Main menu..."<<endl;
  getch();
  system("cls");
}

void ReadStatusRegister()
{    
  cout<<"Read data from STATUS register.\n"<<endl;    

  int data;
  data = Inp32(889);
  cout<<"10: "<<data<<endl;

  char number[20];
  itoa(data,number,2);
  cout<<" 2: "<<number<<endl;

  cout<<"\nPress any key to back to Main menu..."<<endl;
  getch();
  system("cls");
}

void Menu()
{
  cout<<"Select operation:"<<endl;
  cout<<"1 - write data to DATA register."<<endl;
  cout<<"2 - read data from DATA register"<<endl;
  cout<<"3 - write data to CONTROL register."<<endl;
  cout<<"4 - read data from CONTROL register"<<endl;
  cout<<"5 - read data from STATUS register\n"<<endl;
  cout<<"0 - exit"<<endl;
}

int main()
{
  Menu();

  while(1){
  switch(getch())
  {
    case '1': system("cls");
          WriteToDataRegister();
          Menu();
          break;
          
    case '2': system("cls");
          ReadDataRegister();
          Menu();
          break;

    case '3': system("cls");
          WriteToControlRegister();
          Menu();
          break;

    case '4': system("cls");
          ReadControlRegister();
          Menu();
          break;

    case '5': system("cls");
          ReadStatusRegister();
          Menu();
          break;

    case '0': exit(0);
          break;
      }
  }

  return true;
}

Бо мені зараз трохи ніколи.
Так, і дякую Вам, що прислухались до моєї поради.

П.С. Забув сказати про бібліотеку inpout32.zip - взяти можна тут:

x

4

Re: Управління LPT портом*

Мені папку inpout32, треба кинути в папку INCLUDE?

5

Re: Управління LPT портом*

@RAFA
В якій операційній системі ви плануєте виконувати вашу програму? Бо онастогидла мені битва екстрасексів. Якщо під ДОС, то читайте оце

Бодай вас Бог любив, а мене – молодиці!

6 Востаннє редагувалося RAFA (24.06.2013 01:01:30)

Re: Управління LPT портом*

Планую в SPЗ. Написав такий код. Помилок нема, але не працює. (На виході порту не з'являються 1 і 0).

#include <stdio.h>
#include <dos.h>
#include <conio.h>

/********************************************/
/*This program set the parallel port outputs*/
/********************************************/

void main (void)
{
clrscr();             /* clear screen */
outportb(0x378,0xff); /* output the data to parallel port */
getch();              /* wait for keypress before exiting */
}

7 Востаннє редагувалося Очі.завидющі (24.06.2013 01:20:32)

Re: Управління LPT портом*

Підозрюю, що це Windows XP SP3. Доводжу до вашого відома, що прямого доступу до обладнання застосунки МС-ДОС не мають. Довнгредьтеся до 98. До того ж читати документацію ви не хочете, бо скорш за все ваша програма змінює стан другого паралельного порту в системі.

The typical parallel port I/O addess configurations seen on PCs with ISA bus:

LPT1: 3BCh, LPT2: 378h, LPT3: 278h
LPT1: 378h, LPT2: 278h
LPT1: 378h

Але номера портів не завжди типові, тому помедитуйте над цією програмою:

Program lpt1_output;

Uses Dos;

Var
   addr:word;
   data:byte;
   e:integer;

Begin
   addr:=MemW[$0040:$0008];
   Val(ParamStr(1),data,e);
   Port[addr]:=data;
End.

й цією документацією:

Making changes to source code
You can easily change te parallel port number int the source code by just changing the memory address where the program read the parallel port address. For more information, check the following table.

Format of BIOS Data Segment at segment 40h:
Offset  Size    Description
08h    WORD    Base I/O address of 1st parallel I/O port, zero if none
0Ah    WORD    Base I/O address of 2nd parallel I/O port, zero if none
0Ch    WORD    Base I/O address of 3rd parallel I/O port, zero if none
0Eh    WORD    [non-PS] Base I/O address of 4th parallel I/O port, zero if none
For example change the line addr:=MemW[$0040:$0008]; in the source code to addr:=MemW[$0040:$000A]; if you want to output to LPT2.

Це кажу я про прямий доступ до заліза, але якщо захочете використовувати Він ХП, то вже інша справа.

Бодай вас Бог любив, а мене – молодиці!

8

Re: Управління LPT портом*

Так ХР-SP3

У мене всього один порт LPT1.

.........................................................

Якщо я не помиляюсь, то ця програма написана на Паскалі, а я працюю з BORLAND C++ 3.1

9

Re: Управління LPT портом*

Апгрейдте компілер (до PELLES C/Visual Studio Express) або довнгрейдте операційну систему (до Windows 98 - як варіант використовуйте LiveCD)

У мене всього один порт LPT1.

Вам видніше, але не все що є на материнці виведено шлейфами на корпус.

Якщо я не помиляюсь, то ця програма написана на Паскалі, а я працюю з BORLAND C++ 3.1

Не помиляєтесь, але ця програма містить все що вам треба. Гадаю, що 3 рядки кода неважко переробити.
Це лаба/курсак?

Бодай вас Бог любив, а мене – молодиці!

10

Re: Управління LPT портом*

Це курсак. Може треба використати асемблерні вставки ?

11

Re: Управління LPT портом*

Якщо вам леше асемблерною ставкою це зробити - робіть. Але ваш компілер має засоби й без того отримати доступ до пам'яті.

Бодай вас Бог любив, а мене – молодиці!

12

Re: Управління LPT портом*

Так, чому ж не з'являються сигнали на виході порта ?

13 Востаннє редагувалося Очі.завидющі (24.06.2013 14:14:31)

Re: Управління LPT портом*

Змінений код програми й назву ОС у якій воно виконується в студію!

Бодай вас Бог любив, а мене – молодиці!

14

Re: Управління LPT портом*

ОС Windows XP  - SP 3
.........................................

    #include <stdio.h>
    #include <dos.h>
    #include <conio.h>
     
    /********************************************/
    /*This program set the parallel port outputs*/
    /********************************************/
     
    void main (void)
    {
    clrscr(); /* clear screen */
    outportb(0x378,0xff); /* output the data to parallel port */
    getch(); /* wait for keypress before exiting */
    }

15

Re: Управління LPT портом*

Чи я не казав, що код не отримає доступ до заліза в ОС Windows XP ? Навіщо вам форум, якщо ви слухати не хочете?

Змінений код програми

Я код за вас писати не збираюся - приклади й документацію дав, тож йдіть працюйте. Копіюванням однакового коду ви нічого не досягнете.

Бодай вас Бог любив, а мене – молодиці!

16

Re: Управління LPT портом*

Може мені треба переходити на Microsoft Visual C++?

17

Re: Управління LPT портом*

Як вирішите переходити на Microsoft Visual C++ то читайте оце

Бодай вас Бог любив, а мене – молодиці!

18

Re: Управління LPT портом*

Думаю з Microsoft Visual C++ проблем таких не буде