Problem beim Portieren von 16 auf 32 bit (PortOpenMSWindows)
-
Ich habe einen 16bit Treiber für ein Peripheriegerät (COM-Port). Der Code dafür wurde in 16bit in Visual Studio 1.5 geschrieben. Ich möchte in nun in 32 bit kompilieren, um ihn in mein Programm einbinden zu können.
Folgende Fehler im Code konnte ich noch nicht beheben, vielleicht kennt jemand diese alten funktionen und weiss, wie man sie durch neue ersetzt:port=PortOpenMSWindows(COM1+port_offs,19200L,'N',8,1);port ist ein Zeiger auf folgende struktur
typedef struct { /* General and communication parametrs * Alter these eight fields after comm_port_new() (where defaults * values are set) before calling comm_port_install_handler to * get the comm line going. The prefered way to access them is to * use the access functions below. */ char szName[DZCOMM_MAX_PORT_NAME_LENGTH+1]; /* name of comm port. */ int fd; /* File descriptor for OSes that use one for this */ unsigned short int nPort; /* comm port address eg. 0x3f8 */ unsigned char nIRQ; /* comm IRQ eg. 3 */ baud_bits nBaud; /* baud rate */ data_bits nData; /* data length */ stop_bits nStop; /* stop bits */ parity_bits nParity; /* parity */ flow_control_type control_type; /* control type */ /* The next two fields are for setting up functions which are called * (if set). The code _must_ be in locked memory and _must_ not demand * much CPU. They are called when the UART returns particular conditions * in either MSR or LSR registers. The registers are polled and a call * to the handlers issued if they are set (ie. non NULL). */ int (*msr_handler)(/* comm_port *port, int msr_contents */); int (*lsr_handler)(/* comm_port *port, int lsr_contents */); /* Internal flags used for flow control and bit trimming. */ unsigned char xon; unsigned char xoff; unsigned char xonxoff_send; unsigned char xonxoff_rcvd; unsigned char rts; unsigned char cts; unsigned char valid_bit_mask; /* next two fields are for byte counting */ unsigned int in_cnt; //counter for input data unsigned int out_cnt; //counter for output data /* Next two fields used for setting up the IRQ routine and * (un)masking the interrupt in certain circumstances. */ unsigned short int nIRQVector; unsigned char interrupt_enable_mask; /* Internal field to know the state of the comm port and for fitting it * into a list. */ enum {PORT_INSTALLED, PORT_NOT_INSTALLED} installed; unsigned char keep_chaining; void *next_port; void *last_port; /* input and output queues */ fifo_queue *InBuf; /* pointer to read buffer */ fifo_queue *OutBuf; /* pointer to write buffer */ /* This lot are set up to minimise CPU time where accessing the comm * port's registers. */ unsigned short int THR; /* Transmitter Holding Register */ unsigned short int RDR; /* Reciever Data Register */ unsigned short int BRDL; /* Baud Rate Divisor, Low usint */ unsigned short int BRDH; /* Baud Rate Divisor, High Byte */ unsigned short int IER; /* Interupt Enable Register */ unsigned short int IIR; /* Interupt Identification Register */ unsigned short int FCR; /* FIFO Control Register */ unsigned short int LCR; /* Line Control Register */ unsigned short int MCR; /* Modem Control Register */ unsigned short int LSR; /* Line Status Register */ unsigned short int MSR; /* Modem Status Register */ unsigned short int SCR; /* SCR Register */ unsigned short int ISR_8259; /* interrupt service register */ unsigned short int IMR_8259; /* interrupt mask register */ } comm_port;auch diese funktionen sind unbekannt:
ElapsedTime()
SetDefaultBufferSize
WriteBufferTimed
WriteCharTimed
SpaceUsedinRXBufferweiß jemand wo diese funktionen definiert sind, oder kennt ersatz für sie?
danke
-
gibbet für fast alles winapis.
guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/communications_functions.asp
-
ich hab jetzt einige dieser funktionen schon ersetzten können, u.a. das port öffenen und empfangen von daten.
beim senden habe ich allerdings noch probleme:
im original wird ein relais des endgerätes folgendermaßen gesetztWriteChar(port,'\x93'); relbyte|=0x04; if(state) relbyte|=0x02; WriteChar(port,(char)relbyte);
-
sorry, zu früh abgeschickt..hier die fortsetztung:
dabei ist also diese "WriteChar" funktion nicht definiert.
ich habe dann versucht sie folgendermaßen zu ersetzten:BOOL CSerial::WriteByte(byte buf) { DWORD dwBytesWritten; BOOL res; res=WriteFile(m_hCom,(LPSTR)&buf,1,&dwBytesWritten,NULL); return res; }allerdings passiert nichts...woran kann das liegen? welche anderen möglichkeiten gibt es bytes über den port zu senden? oder gibt es optionen die die writefile funktion verwendet, die ich noch verändern könnte?