FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Gracias a krlox31416, escafandra, cHackAll por la ayuda brindad ,
Después de tanto buscar y buscar encontré unos códigos que me pueden servir para lo que quiero hacer, mezclando estos códigos con lo que me dio escafandra sobre (XOR, OR, AND). Códigos Encontrados: ---------------------- // para salida void outp(char x) { asm mov dx,0x378 asm mov al,x asm out dx,al } //para entrada char inp(void) { char x; asm mov dx,0x378 asm mov al,x asm in al,dx asm mov x,al return x; } -AAA Estos codicos los encontre en www.elrincondelc.com , espero que no tenga nada que ver que los ponga a qui no... Despues les cuento como me ha ido con todo esto... Gracias por toda la ayuda [Saludos]... |
#2
|
||||
|
||||
ok's hijo!!!... se agradecen las gracias...
yo casi no he tenido la oportunidad de ayudar o aportar algo de mi en este foro...
la verdad es que terde mucho en saber manejar las funciones de este foro y hasta hace poco le agarre ley... y si se siente chido que alguien desonocido que esta a mucha distancias te agradesca por la ayuda... = mete gracias a ti por seguir aportando ideas... es mas gracias a todos no??? o que show??? bueno pues gracias a todos!!! y... saludos a todos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!! |
#3
|
|||
|
|||
Solucionado
Hola a todos de nuevo;
Al final logre hacer lo que tanto queria, gracias a ustedes y a otras paginas que visite, Aqui les dejo algo de mi code utilizado por si alguien le interesa y tienen la misma duda que yo tenia... Code: (OnClick del Button) ------ int a=0; int b=0; int c=0; int d=0; int e=0; int f=0; int g=0; int h=0; int res=0; char resul=0; if (CheckBox1->Checked==true) a=1; if (CheckBox2->Checked==true) b=2; if (CheckBox3->Checked==true) c=4; if (CheckBox4->Checked==true) d=8; if (CheckBox5->Checked==true) e=16; if (CheckBox6->Checked==true) f=32; if (CheckBox7->Checked==true) g=64; if (CheckBox8->Checked==true) h=128; res=a+b+c+d+e+f+g+h; //Convirtiendo de int a char resul=(char)res; //Abriendo y Cerrando los puertos con codico de ensamble asm mov dx,0x378 asm mov al,resul asm out dx,al Explico un poco de lo utilizado: Tengo 8 CheckBox,cada uno me enciende y apaga un puerto diferente ejemplo si esta activado el CheckBox1 y 5 se te enciente el Ping 2 y 6 del puerto paralelo. -Todo ese codico recuerden que se pone en el OnClick de un boton que es el que va a Actualizar los puertos (Es el que va a hacer la funcion de Encender y Apagar los puertos selecccionados)... Espero que le sea de Utilidad . [Saludos]... |
#4
|
||||
|
||||
He investigado el tema de leer y escribir en los puertos, dada la peculiar dificultad en XP que obliga al uso de librerías externas o al uso de drivers.
Voy a colocar un código que funciona sin librerías ni drivers. El único requisito es que seamos Administradores del sistema. Con un driver funciona sin ser administradores, pero para instalar dicho driver si debemos tener esos privilegios. El truco está en usar una API poco conocida y que se usa para los Debuggers: ZwSystemDebugControl. Código:
//--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused //------------------------------------------------------------------------ #include <windows.h> #include <stdio.h> //#pragma comment(lib, "advapi32") //#pragma link "advapi32.lib" #define NTAPI __stdcall typedef int NTSTATUS; typedef enum _SYSDBG_COMMAND { SysDbgSysReadIoSpace = 14, SysDbgSysWriteIoSpace = 15 }SYSDBG_COMMAND, *PSYSDBG_COMMAND; typedef NTSTATUS (NTAPI * PZwSystemDebugControl) ( SYSDBG_COMMAND ControlCode, PVOID InputBuffer, ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength, PULONG ReturnLength ); PZwSystemDebugControl ZwSystemDebugControl = NULL; typedef struct _IO_STRUCT { DWORD IoAddr; // IN: Aligned to NumBYTEs,I/O address DWORD Reserved1; // Never accessed by the kernel PVOID pBuffer; // IN (write) or OUT (read): Ptr to buffer DWORD NumBYTEs; // IN: # BYTEs to read/write. Only use 1, 2, or 4. DWORD Reserved4; // Must be 1 DWORD Reserved5; // Must be 0 DWORD Reserved6; // Must be 1 DWORD Reserved7; // Never accessed by the kernel } IO_STRUCT, *PIO_STRUCT; BOOL EnablePrivilege (PCSTR name) { HANDLE hToken; TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}}; LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid); OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken); AdjustTokenPrivileges (hToken, FALSE, &priv, sizeof priv, 0, 0); CloseHandle (hToken); return (GetLastError() == ERROR_SUCCESS); } BOOL Inicializa() { HMODULE hNtdll; hNtdll = LoadLibrary ("ntdll.dll"); if(EnablePrivilege(SE_DEBUG_NAME)==FALSE){ printf("Usted no tiene suficientes privilegios\n"); return FALSE; } if(hNtdll){ ZwSystemDebugControl = (PZwSystemDebugControl)GetProcAddress(hNtdll, "ZwSystemDebugControl"); return TRUE; } return FALSE; } BYTE InPortB(int Port) { BYTE Value; IO_STRUCT io; io.IoAddr = Port; io.Reserved1 = 0; io.pBuffer = (PVOID)(PULONG)&Value; io.NumBYTEs = sizeof(BYTE); io.Reserved4 = 1; io.Reserved5 = 0; io.Reserved6 = 1; io.Reserved7 = 0; ZwSystemDebugControl(SysDbgSysReadIoSpace, &io, sizeof(io), NULL, 0, NULL); return Value; } void OutPortB(int Port, BYTE Value) { IO_STRUCT io; io.IoAddr = Port; io.Reserved1 = 0; io.pBuffer = (PVOID)(PULONG)&Value; io.NumBYTEs = sizeof(BYTE); io.Reserved4 = 1; io.Reserved5 = 0; io.Reserved6 = 1; io.Reserved7 = 0; ZwSystemDebugControl(SysDbgSysWriteIoSpace, &io, sizeof(io), NULL, 0, NULL); }; void BeepOn (int Freq) { BYTE b; if((Freq >= 20) && (Freq <= 20000)){ Freq = 1193181 / Freq; b = InPortB(0x61); if((b & 3) == 0){ OutPortB (0x61, (BYTE) (b | 3)); OutPortB (0x43, 0xb6); } OutPortB (0x42, (BYTE)Freq); OutPortB (0x42, (BYTE)(Freq >> 8)); } } void BeepOff (void) { BYTE b; b = (InPortB(0x61) & 0xfc); OutPortB(0x61, b); } // Sólo funciona en Windows XP y superiores // Se debe ser Administrador del Sistema int main(void) { if(Inicializa()==FALSE){ printf("Error al inicializar los puertos\n"); Sleep (2000); return 0; } // Aquí podemos utilizar las funciones InPortB y OutPortB // Activamos el altavoz del sistema durante 300ms con una frecuencia // de 1000Hz BeepOn(1000); // frecuencia de 1000Hz Sleep (300); BeepOff(); return 0; } Patra escribir y leer del puerto paralelo, basta con: Código:
Inicializa(); BYTE B = InPort(0x378); // Lee del puerto paralelo OutPort(0x378, 3); // Escribe en el puerto paralelo el valor 3 Última edición por escafandra fecha: 02-04-2009 a las 22:30:21. Razón: Mejoras en la claridad del código |
#5
|
||||
|
||||
lo malo es que hace tiempo no programo en c
interesante codigo!!!...
tendre que conseguirme el c... jejeje... saludos!!!...
__________________
el cielo me dio un cariño sin merecerlo... chimikuilo!!! |
#6
|
||||
|
||||
Cita:
Saludos. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Puerto paralelo | bactering | Varios | 8 | 15-09-2011 07:55:09 |
PWM con puerto paralelo... | emeceuy | Varios | 5 | 19-07-2007 20:30:23 |
Puerto paralelo en C | Chase | C++ Builder | 0 | 04-07-2005 12:29:37 |
Puerto Paralelo | jorge | Lazarus, FreePascal, Kylix, etc. | 1 | 20-04-2005 03:25:42 |
|