Serial port IRQ

Posted on 1997-03-27
Last Modified: 2006-11-17
Could someone teach me how to enable and use the serial port IRQ. I need this to detect whether there a transmitting or receiving error (like parity error, etc). I'm using turbo C on a 286/386 PC. I would appreciate if you could include some examples.

Thanks ;)

Question by:sky123
1 Comment

Accepted Solution

emmons earned 100 total points
ID: 1249778
unsigned _bios_serialcom( unsigned service, unsigned serial_port, unsigned data );
service Communications service
serial_port Serial port to use
data Port configuration bits
#include <bios.h>
The _bios_serialcom routine provides serial communications services using INT 0x14. The serial_port argument is set to 0 for COM1, to 1 for COM2, and so on. The _bios_serialcom routine may not be able to establish reliable communications at baud rates in excess of 1200 baud ( _COM_1200) due to the overhead associated with servicing computer interrupts. Faster data communication rates are possible with more direct programming of serial-port controllers. For more details on serial-communications programming in C, see C Programmer's Guide to Serial Communications. (More information on this book is found in Other Books of Interest)
The service argument can be set to one of the following manifest constants:
·      _COM_INIT Sets the port to the parameters specified in the data argument
·      _COM_SEND Transmits the data characters over the selected serial port
·      _COM_RECEIVE Accepts an input character from the selected serial port
·      _COM_STATUS Returns the current status of the selected serial port
The data argument is ignored if service is set to _COM_RECEIVE or _COM_STATUS. The data argument for _COM_INIT is created by combining (with the OR operator) one or more of the following constants:
·      _COM_CHR7  7 data bits
·      _COM_CHR8 8 data bits
·      _COM_STOP1 1 stop bit
·      _COM_STOP2 2 stop bits
·      _COM_NOPARITY No parity
·      _COM_EVENPARITY Even parity
·      _COM_ODDPARITY Odd parity
·      _COM_110 110 baud
·      _COM_150 150 baud
·      _COM_300 300 baud
·      _COM_600 600 baud
·      _COM_1200 1200 baud
·      _COM_2400 2400 baud
·      _COM_4800 4800 baud
·      _COM_9600 9600 baud
The default value of data is 1 stop bit, no parity, and 110 baud.
Return Value
The function returns a 16-bit integer whose high-order byte contains status bits. The meaning of the low-order byte varies, depending on the service value. The high-order bits, following, have these meanings:
·      15 Timed out
·      14 Transmission-shift register empty
·      13 Transmission-hold register empty
·      12 Break detected
·      11 Framing error
·      10 Parity error
·      9 Overrun error
·      8 Data ready
When service is _COM_SEND, bit 15 is set if data could not be sent. When service is _COM_RECEIVE, the byte read is returned in the low-order bits if the call is successful. If an error occurs, any of the bits 9, 10, 11, or 15 is set. When service is _COM_INIT or _COM_STATUS, the low-order bits are defined as follows:
·      7 Receive-line signal detected
·      6 Ring indicator
·      5 Data set ready
·      4 Clear to send
·      3 Change in receive-line signal detected
·      2 Trailing-edge ring indicator
·      1 Change in data-set-ready status
·      0 Change in clear-to-send status
Note that this function works only with IBM personal computers and true compatibles.
ANSI    MS-DOS    QWIN    UNIX    WIN    WIN DLL        
/* BSERIALC.C: This program checks the status of serial port COM1. */

#include <bios.h>
#include <stdio.h>

void main( void )
   unsigned com1_status;

   com1_status =  _bios_serialcom( _COM_STATUS, 0, 0 );
   printf ( "COM1 status: 0x%.4x\n", com1_status );

Another possiblilty

/* Compile options needed: none
 - The following program is a simple example which sends and receives
   one character to/from COM1:
#include <stdio.h>
#include <bios.h>
void main(void)
    unsigned com1_status;
    unsigned com1_send;
    unsigned com1_rec;
    unsigned com1_init;
    int result, mask;
    /* open serial port at 1200 baud, 8 data bits,
    ** No parity, 1 stop bit */
    com1_init = _bios_serialcom(_COM_INIT, 0,
        _COM_CHR8 | _COM_NOPARITY | _COM_STOP1 | _COM_1200);
    printf("Init status: 0x%4.4X\n", com1_init);
    /* send an '*' to com1 */
    com1_send = _bios_serialcom(_COM_SEND, 0, '*');
    printf("Send status: 0x%4.4X\n", com1_send);
    mask = 0x6100;
    /* value used to mask:
    *    bits 0-7 are related to modems,
    *    bits 8-15 are for port status,
    *      check to see that the following bits are set:
    *         8 (data ready)
    *        13 (Transmission-hold  register empty)
    *        14 (Transmission-shift register empty)
    /* check the status */
    com1_status = _bios_serialcom(_COM_STATUS, 0, 0);
    printf("COM1 status: 0x%4.4X\n", com1_status);
    /* wait until a character is ready */
    do {
        /* check the status */
        com1_status = _bios_serialcom(_COM_STATUS, 0, 0);
        /* mask off the low order byte of com1_status */
        com1_status = com1_status & 0xFF00;
    } while( (mask & com1_status) == 0);
    /* get a character */
    com1_rec =  _bios_serialcom(_COM_RECEIVE, 0, 0);
    printf("Read status: 0x%4.4X\n", com1_rec);
    /* print the character we just received */
    result = com1_rec & 0x00FF;
    printf("Character: 0x%2.2X  =  %c\n", result, (char)result);
These compiled and ran fine with my Borland 5.

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now