Port LPT

0

Jakie są biblioteki do obsługi portu LPT?

0

jeśli to XP: poszukaj sobie UserPort albo odrazu ściągnij
skopiuj UserPort.sys do C:\WINDOWS\system32\drivers\ i odpal UserPort.exe z dowolnego katalogu. Teraz masz dostęp do portów

dostęp? najprościej w asmie
[NASM]

  mov dx,word[$port]
  in al,dx ; odczyt bajtu
  mov byte[$bajt],al
0

A gdzie moge znaleś jakąś dokumentacje jak sterować portami (jakie są funkcje), bo chciałbym napisać program który strował by diodami LED po podłączeniu ich do portu LPT.

0

nie ma kursow programowania tego portu bo poco, poszukaj sobie w necie opis, przy porcie lpt masz trzy rejestry, rejestr bazowy dostepny dla lpt1 na 0x378 (chyba) - wystarczy wrzucic bajt i masz zapalone odpowiednie z 8 pinow tego portu (D0-D7)...

0

http://www.easy-soft.tsnet.pl/artykuly/lptecp/lptecp.html
kilka moich zbiorów http://free.of.pl/s/sapero/lptpdf.zip

CQ CQ DX!

Mam prośbę o podanie mi wartości stałej IOCTL_CHANGER_GET_PARAMETERS
potrzebuję jej do funkcji DeviceIoControl żeby obadać zakres portów dla poszczególnych portów LPT

wiem że

IOCTL_CHANGER_GET_PARAMETERS = CTL_CODE(IOCTL_CHANGER_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS) 

wprawdzie mam zasób includów z C i C++, ale trapi mnie

#define CTL_CODE(t,f,m,a) (((t)<<16)|((a)<<14)|((f)<<2)|(m))

nie wiem jak to ugryźć, wiem że X<<1 to shift w lewo jeden raz

z tego co mi wyszło, to IOCTL_CHANGER_GET_PARAMETERS = 0x304000
a funkcja mi wywala error "0x57 parametr jest nieprawidłowy"
is this correct? Copy [green]

0

nie ma kursow programowania tego portu bo poco, poszukaj sobie w necie opis, przy porcie lpt masz trzy rejestry, rejestr bazowy dostepny dla lpt1 na 0x378 (chyba) - wystarczy wrzucic bajt i masz zapalone odpowiednie z 8 pinow tego portu (D0-D7)...

Nom o to chodziło to też wiem ale jak to wygląda na "papierze"?

Szukam w google ale pod jakiem zapytaniem najlepiej szukać?

Szukam tak:
C++ +LPT
C++ +port LPT
programowanie +LPT
bibliteki LPT

Jak jeszcze można?

Znalazłem coś:

http://knf.univ.gda.pl/~lothar/wyklad1/wyklad.htm

jest tam kod ale pod Borlanda a jak to zrobić pod Visuala?

0

poszukaj bibliotki inpout

0

No poszukałem:
W kategorii polski na googlach nic nie znalazł(trudno żęby znalazł :-| )
W kategorii z całego świata troche więcej koło 2000...

Znalazłem ciekawą stronke http://www.logix4u.net/

No poczytałem troche na tyle ile umiem angielski(mam 16lat)

I skleiłem takie coś:

#include < conio.h > 
#include < stdio.h >
#define ABP 0x378 

void main(void)
{
int wart;

wart=inb(ABP); 

printf("\n %d \n",wart);
} 

W trakcie kompilacji wyskakuje błąd.

--------------------Configuration: LPT - Win32 Debug--------------------
Compiling...
LPT.cpp
c:\program files\microsoft visual studio\myprojects\lpt\lpt.cpp(13) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.

LPT.exe - 1 error(s), 0 warning(s)

Może ktoś napisze mi albo naprowadzi przykładowy mały programik, który wysyła info do któregoś pinów D0-D7... ;(

0

wycinek z example userport

void outportb(UINT portid, BYTE value)
{
  __asm mov edx,portid
  __asm mov al,value
  __asm out dx,al
}

BYTE inportb(UINT portid)
{
  unsigned char value;
  
  __asm mov edx,portid
  __asm in al,dx
  __asm mov value,al
  return value;
}
0

wycinek z example userport

void outportb(UINT portid, BYTE value)
{
  __asm mov edx,portid
  __asm mov al,value
  __asm out dx,al
}

BYTE inportb(UINT portid)
{
  unsigned char value;
  
  __asm mov edx,portid
  __asm in al,dx
  __asm mov value,al
  return value;
}

Wiem zauważyłem to wczoraj i dziś zamierzam coś napisać.
Dzięki za to :)

0

HAHAHA!!!NAPISAŁEM!!!! :D :D :D :) :) :)
Tylko jak moge wysyłać binarki np.
10000000
albo
01000000
I jak np. litera a wygląda w systemie binarnym?

// nie no, to już lekka przesada [mf]

0

uzyj tablicy ascii, kazdy char z niej ma swoj numer (od 0000 0000 do 1111 1111), a kazdy char do jednobajtowy int.

0

Znalazałem w książce od C :)
Bit Wartość binarna Stała szesnastkowa
7 10000000 0x80
6 01000000 0x40
5 00100000 0x20
4 00010000 0x10
3 00001000 0x08
2 00000100 0x04
1 00000010 0x02
0 00000001 0x01

:)
hmmmm...a może ktoś wie do jakiej bibliteki należy funkcja Sleep(1)

Bo teraz będę się bawić z czasem, ale nie pamiętam jakich bibliotek do tego użyć [wstyd] W końcu diody muszą migać :d

0

eh, nie okazuj publicznie takiej wiedzy ;)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp na dole strony dla każdej funcji pisze co trzeba includować, tutaj windows.h

0

A jak np. z byte:
00000001 zrobić byte 00100001 :-/

0

byte += 32
albo
byte |= 32
albo
byte += (byte<<5)
albo
byte=33 :D

0

byte += 32
albo
byte |= 32
albo
byte += (byte<<5)
albo
byte=33 :D

BUHAHAHAHA!!! :D :D :D
Ale możesz mi wytłumaczyć o co w tym chodzi? :P

0

już jednego uczyłem o systemie binarnym. Zerknij na te wypociny

0

Liczebe binarną na dziesiętną umiem zamieniać, ale jak zmienić binarną na szesnastkową? Jaki jest wzór, albo jak można w C zmieniać liczbę binarną w szesnastkową... [???]

0

to jest najprostsze: dzielisz liczbę na czterobitowe części: 110100110 -> 1101 i 0110
wszystkie części zmieniasz sobie na dec (13 i 6)
13 to jest w hexie cyfra D, a 6 to nadal 6, więc masz 0xD6

0

to jest najprostsze: dzielisz liczbę na czterobitowe części: 110100110 -> 1101 i 0110
wszystkie części zmieniasz sobie na dec (13 i 6)
13 to jest w hexie cyfra D, a 6 to nadal 6, więc masz 0xD6

A rzeczywiście łatwe :)
Tylko nie wiem jak np. bedzie 14 albo 16,17, bo 13 to jest D to wiem.

0

kto zapisze liczbę 16 w czterech bitach, temu stawiam CAŁE tiramisu.
Cyfry szesnastkowe to 0123456789ABCDEF; F to największa cyfra =15 po naszemu, albo 1111bin
jeśli liczba binarna ma np. 9 bitów, to ten pierwszy od lewej już należy do osobnej cyfry szesnastkowej: 000x xxxx xxxx

hmm, a jak by to skonwertować do hexa?
liczba & 15 -> numer mniej-znaczącej (LSB) cyfry HEX
(liczba & 240)/16 -> numer bardziej-znaczącej (MSB) cyfry HEX

tera 'trza' każdy numer cyfry przerobić na cyfrę HEX
<ascii>cyfra=48 + numer_cyfry
if cyfra>57 then cyfra+=7
a zatem dodajesz 48 do numeru cyfry i jeśli wyszedł znak ascii ponad "9" dodajesz 7, aby cyfra 10 była znakiem ascii "A"

0

kto zapisze liczbę 16 w czterech bitach, temu stawiam CAŁE tiramisu.
Cyfry szesnastkowe to 0123456789ABCDEF; F to największa cyfra =15 po naszemu, albo 1111bin
jeśli liczba binarna ma np. 9 bitów, to ten pierwszy od lewej już należy do osobnej cyfry szesnastkowej: 000x xxxx xxxx

hmm, a jak by to skonwertować do hexa?
liczba & 15 -> numer mniej-znaczącej (LSB) cyfry HEX
(liczba & 240)/16 -> numer bardziej-znaczącej (MSB) cyfry HEX

tera 'trza' każdy numer cyfry przerobić na cyfrę HEX
<ascii>cyfra=48 + numer_cyfry
if cyfra>57 then cyfra+=7
a zatem dodajesz 48 do numeru cyfry i jeśli wyszedł znak ascii ponad "9" dodajesz 7, aby cyfra 10 była znakiem ascii "A"

Dzięki to bardzo bardzo mi pomogło i przy okazji nauczyłem się troche o binarach.
Teraz wiem jak przesyłać bity przez port. :)

0

Witam...
Mam pewien problem jak tu czytam ten temat to miem jak zasterować port LPT całym bajtem, a ja mam pytanie jak zasterować port bit po bicie czyli jak wysłać jeden bit na port

0

Nie da rady bezpośrednio, musisz odczytać, zmodyfikować i zapisać cały bajt.

0

jedno pytanie co tu jest nie tak

#include <iostream>
#include <windows.h>
#include <conio.h> 
#include <stdio.h>
#include<math.h>

using namespace std;
void outportb(UINT portid, BYTE value)
{
__asm ("mov edx,portid");
  __asm ("mov al,value");
  __asm ("out dx,al");
}

int main() 
{
    
}

Używam Dev-C++

Wyskakuje mi coś takiego:

Assembler messages:

too many memory references for `mov'

too many memory references for `mov'

too many memory references for `out'

0

To nie zadziała , bez sterowników w ten sposób możesz się odwoływać do portów
w systemie win98 i wcześniejszych chyba że przetestujesz coś takiego - nie sprawdzałem osobiście:
http://www.elektroda.pl/rtvforum/topic515123.html

0

wgrany jest userport i chodziło to kiedyś tylko zgubiłem tamten plik i piszę od nowa ale nie pamiętam już jak to do końca leciało.... może coś z tym poradzicie

#include <iostream>
#include <windows.h>
#include <conio.h> 
#include <stdio.h>
#include<math.h>

using namespace std;
void outportb(UINT portid, BYTE value)
{
  __asm (".intel_syntax\n" );
  __asm ("mov edx,portid");
  __asm ("mov al,value");
  __asm ("out dx,al");
  __asm (".att_syntax\n");
}

int main() 
{
    
}

I wyskakuje coś takiego:

[Linker error] undefined reference to portid' [Linker error] undefined reference to value'

0

Zamiast portid napisz [ebp+8], a zamiast value - [ebp+12].
Jeżeli zlinkujesz sobie msvcrt.a to tam masz gotowe funkcje _inp(port) i _outp(port,data). Sześć prototypów jest w conio.h z visuala.

A co do dostępu do portów - w XP jest to możliwe bez extra sterowników, sam ntdll to oferuje.

0

a mogę prosić przykład programu zlinkowanym msvcrt.a

1 użytkowników online, w tym zalogowanych: 0, gości: 1