Jakie są biblioteki do obsługi portu LPT?
Port LPT
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
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
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
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)...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
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]
- Rejestracja: dni
- Ostatnio: dni
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?
- Rejestracja: dni
- Ostatnio: dni
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... ;(
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
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;
}
- Rejestracja: dni
- Ostatnio: dni
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 :)
- Rejestracja: dni
- Ostatnio: dni
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]
- Rejestracja: dni
- Ostatnio: dni
- Postów: 475
uzyj tablicy ascii, kazdy char z niej ma swoj numer (od 0000 0000 do 1111 1111), a kazdy char do jednobajtowy int.
- Rejestracja: dni
- Ostatnio: dni
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
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
- Rejestracja: dni
- Ostatnio: dni
A jak np. z byte:
00000001 zrobić byte 00100001 :-/
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
byte += 32
albo
byte |= 32
albo
byte += (byte<<5)
albo
byte=33 :D
- Rejestracja: dni
- Ostatnio: dni
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
- Rejestracja: dni
- Ostatnio: dni
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ą... [???]
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
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
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
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"
- Rejestracja: dni
- Ostatnio: dni
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 xxxxhmm, 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 HEXtera '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. :)
- Rejestracja: dni
- Ostatnio: dni
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
Nie da rady bezpośrednio, musisz odczytać, zmodyfikować i zapisać cały bajt.
- Rejestracja: dni
- Ostatnio: dni
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'
- Rejestracja: dni
- Ostatnio: dni
- Postów: 787
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
- Rejestracja: dni
- Ostatnio: dni
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 tovalue'
- Rejestracja: dni
- Ostatnio: dni
- Postów: 513
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.
- Rejestracja: dni
- Ostatnio: dni
a mogę prosić przykład programu zlinkowanym msvcrt.a