Avatar billede seco Nybegynder
27. december 2001 - 17:59 Der er 18 kommentarer og
1 løsning

outport/inport fejl i visual c++

Får følgende fejl når jeg build midt program
Linking...
I2C.obj : error LNK2001: unresolved external symbol _outport
I2C.obj : error LNK2001: unresolved external symbol _inport
Debug/dimmer.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

dimmer.exe - 3 error(s), 0 warning(s)

Har fundet følgende fra Soepro, men er ikke helt med på hvor kode stumpen skal placers (ASM).Bruger Microsoft Visual C++


inp og outp funktionerne er ganske rigtigt \"gamle\" DOS funktioner, dvs. funktioner som kun er tilladte hvis programmet kører som et DOS program/under DOS boks. Grunden til at inp og outp ikke længere er tilladte ligger i selv Windows - det er jo (i alt fald et forsøg på at lave) et flerbruger system, og man kan derfor ikke være sikker på at have f.eks. LPT-porten for sig selv. (Word kunne f.eks. være ved at udskrive via porten.)

Jeg har løst problemet i mit program (bruger LPT-porten til at styre noget elektronik) ved at bruge ASM - i den situation sættes Windows begræsningerne nemlig i noget omfang ud af spil:

int inport(int portAddr)
{
  int portData = 0x00;
  asm
  {
    mov  dx,portAddr
    in  al,dx
    mov  portData,al
  };
  return portData;
}

og

void outport(int portAddr, int portData)
{
  // Port data adjusted immediately when changed.
  asm
  {
    mov  dx, portAddr
    mov  al, portData
    out  dx, al
  };
  return;
}
Idet du så med følgende to macroer re-directer dine inp og outp kald til d.o.:

#define inp(x) inport(x)
#define outp(x, y) outport(x, y)
Avatar billede wisen Nybegynder
02. januar 2002 - 10:50 #1
Så vidt jeg husker, skal du i \"project settings->link->Library modules\" inkludere \"libc.lib\"
Avatar billede wisen Nybegynder
02. januar 2002 - 11:03 #2
Har du inkluderet <conio.h> ?
Avatar billede seco Nybegynder
02. januar 2002 - 21:45 #3
Hej tak for svaret, har prøvet at \"inkludere libc.lib\" som beskrevet.


kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libc.lib /nologo /subsystem:console /incremental:yes /pdb:\"Debug/dimmer.pdb\" /debug /machine:I386 /out:\"Debug/dimmer.exe\" /pdbtype:sept

Men får nu følgende fejl.

--------------------Configuration: dimmer - Win32 Debug--------------------
Linking...
LINK : warning LNK4098: defaultlib \"LIBCD\" conflicts with use of other libs; use /NODEFAULTLIB:library
I2C.obj : error LNK2001: unresolved external symbol _outport
I2C.obj : error LNK2001: unresolved external symbol _inport
Debug/dimmer.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

dimmer.exe - 3 error(s), 1 warning(s)


Ja, har inkluderet <conio.h>

Her er et program stump med outport

    Output data to selected IO-port and update the \'IOdata\' & \'IO\' array.
    ---------------------------------------------------------------------
*/
void IOoutput(int Chip_no, int Data)
{
    int Start_Channel, Channel, SerData, cport, i, j;

    Data = (~Data) | IOconfig[Chip_no];    /*Mask input channels*/

    /*Generate start condition*/
    outport(ControlPort, 0x06);
    for (i = 0; i <= I2CbusDelay; i++) {};    /*I2c-bus timing*/
    outport(ControlPort, 0x0E);
    for (i = 0; i <= I2CbusDelay; i++) {};    /*I2c-bus timing*/


   
Her er et program stump med input


    /*Serial input of previous converted byte*/
    Data = 0;                /*Clear Data*/
    for (j = 1; j <= 8; j++) {
        Data <<= 1;
        outport(ControlPort, 0x04);
        for (i = 0; i <= I2CbusDelay; i++) {};    /*I2c-bus timing*/
        if (inport(StatusPort) & 0x10) Data = Data | 0x0001;
        outport(ControlPort, 0x0C);
        for (i = 0; i <= I2CbusDelay; i++) {};    /*I2c-bus timing*/
    };
Avatar billede chries Nybegynder
02. januar 2002 - 22:44 #4
Jeg ved ikke hvor meget kontrol du har brug for, men du kan sagten have LPT porten for dig selv. Du kan få adgang til LPT porten ved at anvende den som en fil:

    HANDLE hLPT = CreateFile(    \"LPT1\",                            // pointer to name of the file
                                GENERIC_READ|GENERIC_WRITE,    // access (read-write) mode
                                0,                                // share mode
                                NULL,                          // pointer to security attributes
                                OPEN_EXISTING,                  // how to create
                                FILE_FLAG_WRITE_THROUGH,        // file attributes
                                NULL                            // handle to file with attributes to copy
                            );

    if( hLPT == INVALID_HANDLE_VALUE )
    {
        cout << \"Failed\" << endl; // port does not exist or is already acquired
    }
    else
    {
        while(1); // endless loop to hold LPT port
    }

Avatar billede wisen Nybegynder
03. januar 2002 - 08:49 #5
Eller prøv at bruge funktionerne \"_inp\" og \"_outp\", include <conio.h> og fjern libc.lib fra project settings...
Avatar billede seco Nybegynder
03. januar 2002 - 19:48 #6
Har prøvet at rette et par outport/inport til _outp/_inp men får nu også de to siste advarsler når jeg compile programet,men de kommer ikke når jeg prøver et etexecute programet?

Compiling...
I2C.c
D:\\K8000\\opgaver\\dimmer\\I2C.c(297) : warning C4013: \'outport\' undefined; assuming extern returning int
D:\\K8000\\opgaver\\dimmer\\I2C.c(1220) : warning C4013: \'inport\' undefined; assuming extern returning int
D:\\K8000\\opgaver\\dimmer\\I2C.c(295) : warning C4761: integral size mismatch in argument; conversion supplied
D:\\K8000\\opgaver\\dimmer\\I2C.c(1199) : warning C4761: integral size mismatch in argument; conversion supplied

I2C.obj - 0 error(s), 4 warning(s)

Er ikke helt med på hvordan man kan andvende en fil? Kan det forklars så jeg kan fåstå det :-)
Avatar billede soepro Nybegynder
07. januar 2002 - 08:38 #7
Mine kode-stumper, skal du blot inkludere i din kode FØR de funktioner der anvender dem. Alternativ skal du lave en header-fil med prototyperne på funktionerne:

int inport(int adr);
void outport(int port, int data);

og lave #include på den - igen FØR du anvender funktionerne.
Avatar billede soepro Nybegynder
07. januar 2002 - 08:41 #8
F.eks. sådan her:

int inport(int port)
{
  // ASM ...
}
void outport(int port, int data)
{
  // ASM ...
}

int main(void)
{
  if (inport(0x378) != 0xF0)
    outport(0x378, 0xF0);
  return 0;
}
Avatar billede seco Nybegynder
07. januar 2002 - 20:54 #9
Hej, tak for hjælpen .Det køre nu ved brug af \"_inp\" og \"_outp\", include <conio.h> :-))

Hej Soepro kan ikke få det til at funger med ASM
men hvis du kan hjælpe mig med at få det til det så er der også 30 på vej til dig.:-)

#include <windows.h>

  int inport(int portAddr)
{
  int portData = 0x00;
  asm
  {
    mov  dx,portAddr
    in  al,dx
    mov  portData,al
  };
  return portData;
}

void outport(int portAddr, int portData)
{
  // Port data adjusted immediately when changed.
  asm
  {
    mov  dx, portAddr
    mov  al, portData
    out  dx, al
  };

}

int main(void)
{
  if (inport(0x378) != 0xF0)
    outport(0x378, 0xF0);
  return 0;
}
Compiling...
int_outport.c
D:\\K8000\\opgaver\\int_outport\\int_outport.c(7) : error C2065: \'asm\' : undeclared identifier
D:\\K8000\\opgaver\\int_outport\\int_outport.c(7) : error C2143: syntax error : missing \';\' before \'{\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(8) : error C2065: \'mov\' : undeclared identifier
D:\\K8000\\opgaver\\int_outport\\int_outport.c(8) : error C2146: syntax error : missing \';\' before identifier \'dx\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(8) : error C2065: \'dx\' : undeclared identifier
D:\\K8000\\opgaver\\int_outport\\int_outport.c(9) : error C2146: syntax error : missing \';\' before identifier \'in\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(9) : error C2065: \'in\' : undeclared identifier
D:\\K8000\\opgaver\\int_outport\\int_outport.c(9) : error C2146: syntax error : missing \';\' before identifier \'al\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(9) : error C2065: \'al\' : undeclared identifier
D:\\K8000\\opgaver\\int_outport\\int_outport.c(10) : error C2146: syntax error : missing \';\' before identifier \'mov\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(10) : error C2146: syntax error : missing \';\' before identifier \'portData\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(11) : error C2143: syntax error : missing \';\' before \'}\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(19) : error C2143: syntax error : missing \';\' before \'{\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(20) : error C2146: syntax error : missing \';\' before identifier \'dx\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(21) : error C2146: syntax error : missing \';\' before identifier \'mov\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(21) : error C2146: syntax error : missing \';\' before identifier \'al\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(22) : error C2146: syntax error : missing \';\' before identifier \'out\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(22) : error C2065: \'out\' : undeclared identifier
D:\\K8000\\opgaver\\int_outport\\int_outport.c(22) : error C2146: syntax error : missing \';\' before identifier \'dx\'
D:\\K8000\\opgaver\\int_outport\\int_outport.c(23) : error C2143: syntax error : missing \';\' before \'}\'
Error executing cl.exe.

int_outport.obj - 20 error(s), 0 warning(s)
Avatar billede chries Nybegynder
07. januar 2002 - 21:16 #10
prøv en ellet to _ foran asm

_asm

eller

__asm

den bliver blå når det er rigtig
Avatar billede soepro Nybegynder
08. januar 2002 - 09:07 #11
asm er C++ Builder syntax - MVC har åbenbart syntaxen _asm. Nogle compilere kræver at asm står ud for hver enkelt linie, dvs:

asm mov  dx,portAddr;
asm in  al,dx;
asm mov  portData,al;

for at fungere. (Gælder f.eks. Turbo C++ 3.0)
Avatar billede seco Nybegynder
08. januar 2002 - 20:31 #12
Tak det skal skrives \"_asm\" .Men jag får stadig 4 fejl som jeg ikke kan få væk, hvad kan det skylles ?

#include <windows.h>

  int inport(int portAddr)
{
  int portData = 0x00;
  _asm
  {
    mov  dx,portAddr
    in  al,dx        //9
    mov  portData,al
  };                  //11
  return portData;
}

void outport(int portAddr, int portData)
{
  // Port data adjusted immediately when changed.
_asm
  {
    mov  dx, portAddr
    mov  al, portData      //21
    out  dx, al            //22
  };

}

int main(void)
{
  if (inport(0x378) != 0xF0)
    outport(0x378, 0xF0);
  return 0;

--------------------Configuration: int_outport - Win32 Debug--------------------
Compiling...
int_outport.c
D:\\K8000\\opgaver\\int_outport\\int_outport.c(9) : error C2443: operand size conflict
D:\\K8000\\opgaver\\int_outport\\int_outport.c(11) : error C2443: operand size conflict
D:\\K8000\\opgaver\\int_outport\\int_outport.c(21) : error C2443: operand size conflict
D:\\K8000\\opgaver\\int_outport\\int_outport.c(22) : error C2443: operand size conflict
Error executing cl.exe.

int_outport.obj - 4 error(s), 0 warning(s)
Avatar billede chries Nybegynder
09. januar 2002 - 09:48 #13
Okey det her er et gæt:
Prøve at bruge short istedet for portAdr og char for portData, du prøver henholdvis på at putte en int (32bit) ned i dx (16bit) og int i al (8bit) ( = operand size conflict ? ).

det passer lige med 4 fejl :-)


Avatar billede seco Nybegynder
09. januar 2002 - 17:48 #14
Det var et godt gæt ;-)
Har oprettet spørgsmål til chries og soepro
 
int inport(short portAddr)
{
  char portData = 0x00;
  _asm
  {
    mov  dx,portAddr
    in  al,dx       
    mov  portData,al
  };                 
  return portData;
}

void outport(short portAddr, char portData)
{
  // Port data adjusted immediately when changed.
_asm
  {
    mov  dx, portAddr
    mov  al, portData     
    out  dx, al           
  };

}

int main(void)
{
  if (inport(0x378) != 0xF0)
    outport(0x378, 0xF0);
  return 0;
}

Avatar billede chries Nybegynder
09. januar 2002 - 20:07 #15
du burde nok bruge ushort istedet, omend det kun er for syns skyld. Mulighed for negative adresser er ikke særlig kønne :-)
Avatar billede needs Nybegynder
20. april 2004 - 13:44 #16
hey har lånt kode stumpen til et skole projekt. Håber det er okay. Prøver at lave det under XP compiled med .net 2003 og når det bliver kørt kommer der en "Privileged instruction" fejl.... er der nogen der har en idé om hvad man så kan gøre for at få direkte kontrol over LPT'en? har kun inkluderet windows.h er der andet man måske skulle gøre?
Avatar billede chries Nybegynder
20. april 2004 - 13:52 #17
Win nt / 2000 eller større tilader ikke io operationer i user apps. der er et par måder at komme uden om, prøv at læse:

http://www.beyondlogic.org/porttalk/porttalk.htm
Avatar billede chries Nybegynder
20. april 2004 - 13:53 #18
der er en løsning nederst
Avatar billede needs Nybegynder
20. april 2004 - 14:07 #19
Tak chries
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester