Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Function inp / outp

Reply
Thread Tools

Function inp / outp

 
 
Michael Post
Guest
Posts: n/a
 
      05-10-2007
Hello members,

i have a (time-(?))-problem with the serial-communication with an ms-
dos 6.2 and the rs232-interface with an rs485-adapter behind the
interface.

I program in C. As compiler, i am using Open Watcom to build a DOS 16-
bit executable.

When i send the telegram to the device, the device answers very fast
(<1 millisecond).
After complete sending, i set the rts to 0x0 and wait for the answer,
but i got no answer, or i am to slow.
Somewhere is the error.

Maybe someone has some ideas or can give me some tips for better
coding?

Thanks for your help.

Here is my complete code:

#include <stdio.h>
//#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <time.h>

/*
* Define some program keys
*/

// Exit-States
#define EXIT_SUCCESS 1
#define EXIT_UNSUCCESS 0

/**
* Define some information which should be outsourced to a config file
*/

// Sum of devices at COM1
#define SUM_DEVICES_COM1 1

/**
* Constants for serial port
*/

// Return values / Error codes
#define SERIAL_OK 1
#define SERIAL_E_COMPORT_NOT_DEFINED -1
#define SERIAL_E_WRONG_COMPT -2
#define SERIAL_E_WRONG_COMORT -3

// Serial mode for register 3
#define SERIAL_MODE_5BIT 0x00 // Bit
0-1: 00
#define SERIAL_MODE_6BIT 0x01 // Bit
0-1: 01
#define SERIAL_MODE_7BIT 0x02 // Bit
0-1: 10
#define SERIAL_MODE_8BIT 0x03 // Bit
0-1: 11
#define SERIAL_MODE_1STOPBIT 0x00 // Bit 2: 0
#define SERIAL_MODE_2STOPBIT 0x04 // Bit 2: 1
#define SERIAL_MODE_PARITY_NON 0x00 // Bit 3-5: 000
#define SERIAL_MODE_PARITY_ODD 0x08 // Bit 3-5: 001
#define SERIAL_MODE_PARITY_EVEN 0x18 // Bit 3-5: 011
#define SERIAL_MODE_PARITY_MARK 0x28 // Bit 3-5: 101
#define SERIAL_MODE_PARITY_SPACE 0x38 // Bit 3-5: 111
#define SERIAL_MODE_BREAK_CONTROL 0x40 // Bit 6: 0 or
1 Break control;
sends the receiver a break condition
#define SERIAL_MODE_ENABLE_DLR 0x80 // Bit 7: 0 or
1 DLR access
enable; if set, registers 0 and 1 become one big word register (the
DLR)

/**
* Function-Prototypes
*/

int serialInterfaceConnect(int nComPort, const int nBaud, const int
nMode);
void serialInterfaceSetBaudrate(int nComPort, const int nBaud);
char serialInterfaceGetRegister(int nComPort, int nRegister);
void serialInterfaceSendData(int nComPort, char *cString, int nLen);
int serialInterfaceConnect(int nComPort, const int nBaud, const int
nMode);
int serialInterfaceGetPort(int nComPort);
void serialInterfaceSendTelegram(int nCom, char cCommand, int
nSensor);
char vaseGenerateChecksum(const char *cTelegram);

/**
* Functions / Routines
*/
int main(){

int i=1;
int c1=0,c2=0;
int input;
int ii=0, rts_delay=20000;

/* Connect to COM2 */
if(serialInterfaceConnect(serialInterfaceGetPort(2 ), 1200,
SERIAL_MODE_7BIT | SERIAL_MODE_2STOPBIT | SERIAL_MODE_PARITY_EVEN)){
printf("Connected to COM2.\n");
saveToLog(DEBUG, "Connect to COM2.");

/* Connect to COM1 */
if(serialInterfaceConnect(serialInterfaceGetPort(1 ),
19200,
SERIAL_MODE_7BIT | SERIAL_MODE_2STOPBIT | SERIAL_MODE_PARITY_EVEN)){
printf("Connected to COM1.\n");
saveToLog(DEBUG, "Connect to COM1.");

/**
* Initialise all devices
*/
printf("*** Initialise devices ***\n");
for(i=1;i<=SUM_DEVICES_COM1; i++){
// for every device at com1

// Initialise sensor
printf("Activate sensor %d.\n",i);
saveToLog(INFO, "Activate sensor " +
i);

serialInterfaceSendTelegram(serialInterfaceGetPort (1), 'T', i);

// Receive result
c1 = 0;
c1 = inp(serialInterfaceGetPort(1) +
5);
// If so, then get Char
while(c1 & 1){
c2 =
inp(serialInterfaceGetPort(1) + 0);
printf("IN %c
\n",c2); // Print Char to Screen
c1 =
inp(serialInterfaceGetPort(1) + 5);
}// end while

// wait 500 milliseconds
delay(500);

// Get Version
printf("Get Version from sensor %d.
\n", i);
saveToLog(INFO, "Get Version from
sensor.");
saveToLog(INFO, i);


serialInterfaceSendTelegram(serialInterfaceGetPort (1), 'V', i);

// Receive result
c1 = 0;
c1 = inp(serialInterfaceGetPort(1) +
5);
// If so, then get Char
while(c1 & 1){
c2 =
inp(serialInterfaceGetPort(1) + 0);
printf("IN %c
\n",c2); // Print Char to Screen
c1 =
inp(serialInterfaceGetPort(1) + 5);
}// end while
}// end initialise for every device
}
else {
printf("Error: Could not connect to COM1.\n");
saveToLog(ERROR, "Could not connect to
COM1.");
return EXIT_UNSUCCESS;
}
}
else {
printf("Error: Could not connect to COM2.\n");
saveToLog(ERROR, "Could not connect to COM2.");
return EXIT_UNSUCCESS;
}

return EXIT_SUCCESS;

}// end function main

int serialInterfaceConnect(int nCom, const int nBaud, const int nMode)
{
/*
* This function connect to an specified serial-port
*/
int nTmp = 0;

outp(nCom + 1, 0); // Turn off interrupts
outp(nCom + 3, 0x80); // SET DLAB ON
serialInterfaceSetBaudrate(nCom, nBaud); // Set
baud rate

nTmp = nMode & 0x03;
if(nTmp == SERIAL_MODE_5BIT)
saveToLog(DEBUG, " SERIAL_MODE_5BIT");
if(nTmp == SERIAL_MODE_6BIT)
saveToLog(DEBUG, " SERIAL_MODE_6BIT");
if(nTmp == SERIAL_MODE_7BIT)
saveToLog(DEBUG, " SERIAL_MODE_7BIT");
if(nTmp == SERIAL_MODE_8BIT)
saveToLog(DEBUG, " SERIAL_MODE_8BIT");

nTmp = nMode & 0x04;
if(nTmp == SERIAL_MODE_1STOPBIT)
saveToLog(DEBUG, " SERIAL_MODE_1STOPBIT");
if(nTmp == SERIAL_MODE_2STOPBIT)
saveToLog(DEBUG, " SERIAL_MODE_2STOPBIT");

nTmp = nMode & 0x38;
if(nTmp == SERIAL_MODE_PARITY_NON)
saveToLog(DEBUG, " SERIAL_MODE_PARITY_NON");
if(nTmp == SERIAL_MODE_PARITY_ODD)
saveToLog(DEBUG, " SERIAL_MODE_PARITY_ODD");
if(nTmp == SERIAL_MODE_PARITY_EVEN)
saveToLog(DEBUG, " SERIAL_MODE_PARITY_EVEN");
if(nTmp == SERIAL_MODE_PARITY_MARK)
saveToLog(DEBUG, " SERIAL_MODE_PARITY_MARK");
if(nTmp == SERIAL_MODE_PARITY_SPACE)
saveToLog(DEBUG, " SERIAL_MODE_PARITY_SPACE");

nTmp = nMode & SERIAL_MODE_BREAK_CONTROL;
if(nTmp == SERIAL_MODE_BREAK_CONTROL)
saveToLog(DEBUG, " SERIAL_MODE_BREAK_CONTROL");
nTmp = nMode & SERIAL_MODE_ENABLE_DLR;
if(nTmp == SERIAL_MODE_ENABLE_DLR)
saveToLog(DEBUG, " SERIAL_MODE_ENABLE_DLR");

outp(nCom + 3, nMode);
outp(nCom + 2, 0xC7); // FIFO Control Register
saveToLog(DEBUG, "Turn off RTS.");
outp(nCom + 4, 0x0); // Turn off DTR, RTS, and OUT2

return SERIAL_OK;

}

void serialInterfaceSetBaudrate(int nCom, const int nBaud){
int nDivisor = 115200 / nBaud; // 0x1c200 / nBaud

// nDivisor defaults:
// ------------------
// 0x03 = 38,400 BPS
// 0x01 = 115,200 BPS
// 0x02 = 57,600 BPS
// 0x06 = 19,200 BPS
// 0x0C = 9,600 BPS
// 0x18 = 4,800 BPS
// 0x30 = 2,400 BPS
// 0x60 = 1,200 BPS

outp(nCom + 0, nDivisor); // Set Baud rate - Divisor
Latch Low Byte
outp(nCom + 1, 0x00); // Set Baud rate - Divisor
Latch High Byte

}

void serialInterfaceSendData(int nCom, char *cString, int nLen){
int i=0;
for(; i<nLen; i++){
outp(nCom + 0, cString[i]);
}// end for

}

int serialInterfaceGetPort(int nComPort){
/**
* This functions get the adress for the port
*/
int nPort = 0;

switch(nComPort){
case 1:
nPort = 0x3F8;
break;
case 2:
nPort = 0x2F8;
break;
case 3:
nPort = 0x3E8;
break;
case 4:
nPort = 0x2E8;
break;
default:
return SERIAL_E_COMPORT_NOT_DEFINED;
}

printf("Return for %d comPort %d.\n", nComPort, nPort);

return nPort;

}

void serialInterfaceSendTelegram(int nCom, char cCommand, int nSensor)
{
/*
* This function sends a defined telegram over register 4
* to the sensor
*/

char cBuf[10];
char cChecksum;
char cTelegram[5];
int nLen;
int i = 0;

int c1, c2;

printf("Send Telegram for %d.\n", nCom);

// Build telegram data
cTelegram[0] = 'b';
cTelegram[1] = cCommand;
cTelegram[2] = nSensor + 48; // + '0'
cTelegram[3] = '\r';
cTelegram[4] = 0x0;

// Generate checksum
cChecksum = baseGenerateChecksum((char*) &cTelegram[0]);

// Data to send
strcpy(cBuf, cTelegram);
nLen = strlen(cTelegram);

cBuf[4] = cChecksum;
nLen++;
cBuf[5] = 0x0;
nLen++;

/*
* Send telegram to COM
*/
printf("Send telegram manually to OUT: %s\n", cBuf);
// printf("Telegram is %d characters long.\n",nLen);

// Open RTS
outp(nCom + 4, 0x0B); // Turn on RTS

for(i=0;i<nLen;i++){
// Send data
printf("Data %c\n.", cBuf[i]);
outp(nCom + 0, cBuf[i]);
}

// Close RTS
outp(nCom + 4, 0x0); // Turn off RTS

} // end function

char baseGenerateChecksum(const char *cTelegram){
int nChecksum = 0;
unsigned int i=0;

for(; i<strlen(cTelegram); i++) {
nChecksum = nChecksum ^ cTelegram[i]; // Jedes Zeichen
mit XOR
verkn黳fen
}

// Letztes Zeichen muss ein \r (ASCII 13) sein.
if(cTelegram[strlen(cTelegram) - 1] != '\r')
nChecksum = nChecksum ^ '\r';

nChecksum = nChecksum ^ 0xFF; // invertieren
nChecksum = nChecksum & 0x7F; // auf 7 Bit beschneiden
return (char) nChecksum;

 
Reply With Quote
 
 
 
 
Michael Post
Guest
Posts: n/a
 
      05-10-2007
On 10 Mai, 14:28, Michael Post <(E-Mail Removed)> wrote:
> Hello members,
>

......


is outp and inp the fastest way to communicate with the interface, or
other functions are faster?

Thanks for your help.

Michael

 
Reply With Quote
 
 
 
 
kingfox
Guest
Posts: n/a
 
      05-10-2007
On 5月10日, 下午8时55分, Michael Post <(E-Mail Removed)> wrote:
> On 10 Mai, 14:28, Michael Post <(E-Mail Removed)> wrote:> Hello members,
>
> .....
>
> is outp and inp the fastest way to communicate with the interface, or
> other functions are faster?
>
> Thanks for your help.
>
> Michael


I think the inp() and outp() function is the fastest way to access the
interface in C language. Else you can use assembly language to access
the interface. Sorry for can't give you more help because I forgot the
detail about the UART interface. But I think a program written by C
can send data through COMM port in PC at a rate more than 921600bps.
So, I think may be you should check whether the receiver return the
answer signal. May be you need a oscilloscope or a logic analyser to
help you debug this program.

 
Reply With Quote
 
Walter Roberson
Guest
Posts: n/a
 
      05-10-2007
In article <(E-Mail Removed) .com>,
Michael Post <(E-Mail Removed)> wrote:
>i have a (time-(?))-problem with the serial-communication with an ms-
>dos 6.2 and the rs232-interface with an rs485-adapter behind the
>interface.


The standard C language only includes an fopen() function; if fopen()
is not sufficient to open the device conditioned to the right
communication parameters, then you will need to call upon system-
specific libraries that are beyond the scope of C.

To phrase this another way: what you have asked for cannot be done
in standard C, and you need to ask in a newsgroup specific to
your OS.
--
Is there any thing whereof it may be said, See, this is new? It hath
been already of old time, which was before us. -- Ecclesiastes
 
Reply With Quote
 
Kenny McCormack
Guest
Posts: n/a
 
      05-10-2007
In article <f1v9i9$n3t$(E-Mail Removed)>,
Walter Roberson <(E-Mail Removed)-cnrc.gc.ca> wrote:
>In article <(E-Mail Removed) .com>,
>Michael Post <(E-Mail Removed)> wrote:
>>i have a (time-(?))-problem with the serial-communication with an ms-
>>dos 6.2 and the rs232-interface with an rs485-adapter behind the
>>interface.

>
>The standard C language only includes an fopen() function; if fopen()
>is not sufficient to open the device conditioned to the right
>communication parameters, then you will need to call upon system-
>specific libraries that are beyond the scope of C.
>
>To phrase this another way: what you have asked for cannot be done
>in standard C, and you need to ask in a newsgroup specific to
>your OS.


To phrase this yet another way:

Nobody here gives a **** about you or your problems.

You may find some or all of the following links helpful in understanding
why this is so:

http://en.wikipedia.org/wiki/Aspergers
http://en.wikipedia.org/wiki/Clique
http://en.wikipedia.org/wiki/C_programming_language

 
Reply With Quote
 
Carramba
Guest
Posts: n/a
 
      05-10-2007
Kenny McCormack skrev:
> In article <f1v9i9$n3t$(E-Mail Removed)>,
> Walter Roberson <(E-Mail Removed)-cnrc.gc.ca> wrote:
>> In article <(E-Mail Removed) .com>,
>> Michael Post <(E-Mail Removed)> wrote:
>>> i have a (time-(?))-problem with the serial-communication with an ms-
>>> dos 6.2 and the rs232-interface with an rs485-adapter behind the
>>> interface.

>> The standard C language only includes an fopen() function; if fopen()
>> is not sufficient to open the device conditioned to the right
>> communication parameters, then you will need to call upon system-
>> specific libraries that are beyond the scope of C.
>>
>> To phrase this another way: what you have asked for cannot be done
>> in standard C, and you need to ask in a newsgroup specific to
>> your OS.

>
> To phrase this yet another way:
>
> Nobody here gives a **** about you or your problems.


You made my day! haha haven't laughed that hard for some time...
Your evil-mindedness is funny ... but I still can't remember when I
started to appreciate good malice .. must since I started to read
comp.lang.c ...
and yes, I get it.. nobody gives a **** about it either...

> You may find some or all of the following links helpful in understanding
> why this is so:
>
> http://en.wikipedia.org/wiki/Aspergers
> http://en.wikipedia.org/wiki/Clique
> http://en.wikipedia.org/wiki/C_programming_language
>

 
Reply With Quote
 
Christopher Benson-Manica
Guest
Posts: n/a
 
      05-10-2007
Carramba <(E-Mail Removed)> wrote:

> Kenny McCormack skrev:
> > (trollspeak snipped)


*Please* ignore Mr. McCormack. He is neither pleasant nor helpful.

--
C. Benson Manica | I *should* know what I'm talking about - if I
cbmanica(at)gmail.com | don't, I need to know. Flames welcome.
 
Reply With Quote
 
Kenny McCormack
Guest
Posts: n/a
 
      05-10-2007
In article <f1vq3p$qnk$(E-Mail Removed)>,
Christopher Benson-Manica <(E-Mail Removed)> wrote:
>Carramba <(E-Mail Removed)> wrote:
>
>> Kenny McCormack skrev:
>> > (trollspeak snipped)

>
>*Please* ignore Mr. McCormack. He is neither pleasant nor helpful.


Got ya on the run, don't I?

 
Reply With Quote
 
Michael Post
Guest
Posts: n/a
 
      05-10-2007
Hello,

thanks all for your very explained versions of answers.
Thanks espacially to Kingfox for his answer.

The rest of answers are very shitty. This group is called comp.lang.c
and noch comp.lang.ansi-c

I have a problem with c ... ok, seems like not being in the ansi-
standard, but i hoped for a qualified answer here at this mailinglist
and not this ****.

When someone does not want to answer me then he should not do it, but
not answer with this non-productive text, because i search for a
qualified answer for my question and no answer like " youre **** and
we don磘 want to answer it, cause it is no ansi".

Now i spurn this list and will not ask anymore any questions or other
phrases.

This is my meening.

Thanks for your genial welcome.

Michael

 
Reply With Quote
 
Michael Post
Guest
Posts: n/a
 
      05-10-2007
Hello Walter,

On 10 Mai, 16:17, (E-Mail Removed)-cnrc.gc.ca (Walter Roberson) wrote:
> In article <(E-Mail Removed) .com>,


.....

And Thanks for your answer, Walter.

Michael

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Graphics display outp rex Computer Support 4 12-06-2006 01:50 PM
write a function such that when ever i call this function in some other function .it should give me tha data type and value of calling function parameter komal C++ 6 01-25-2005 11:13 AM
Passing a C++ object's member function to a C function expecing a function pointer! James Vanns C++ 7 01-21-2004 02:39 AM
How to use the outp(...) command Todd Gardner Python 3 12-08-2003 05:36 PM
outp(PORTADDRESS,Data) function in C suchitra C Programming 1 10-17-2003 04:05 AM



Advertisments