TERM3.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:3k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * basic TTY terminal example demonstrating SIO serial i/o library
  3.  *
  4.  * Gets settings from term.ini or creates one if none exists
  5.  *
  6.  * Demonstrates messaging used to multiplex serial i/o with other
  7.  * events.
  8.  *
  9.  * The keyboard thread and the sio subsystem can both generate events
  10.  * for the serial thread.  Either event will awaken the serial thread
  11.  * and it will then act on the request.
  12.  */
  13. #include <dos.h>
  14. #include <stdio.h>
  15. #include <rtos.h>
  16. #include <sio.h>
  17. #include <inifile.h>
  18. void *peer = NULL;              /* peer for messaging */
  19. #define PEER_KBCHAR  EMSG_USER  /* indicates new keyboard char arrived */
  20. void kbd_thread( DWORD port )
  21. {
  22.     BYTE ch;
  23.     do {
  24.         if ( kbhit() ) {
  25.             ch = getch();
  26.             /* exit on ~ character */
  27.             if ( ch == '~' ) break;
  28.             if ( peer )
  29.                 kwritemessage( peer, PEER_KBCHAR, ch );
  30.         }
  31.         rt_sleep(10);
  32.     } while ( 1 );
  33.     kwritemessage( kmainthread, 0, 0 );
  34. }
  35. void serial_thread( DWORD port )
  36. {
  37.     BYTE ch;
  38.     int msg;
  39.     DWORD val;
  40.     /* get a message when new data arrived */
  41.     sio_msg( port, 0, 1 );
  42.     do {
  43.         kreadmessage( &msg, &val );
  44.         switch ( msg ) {
  45.             case PEER_KBCHAR :
  46.                         sio_writebyte( port, (BYTE) val );
  47.                         break;
  48.             case EMSG_BQ_WAITING :
  49.                         /* could be several chars */
  50.                         while ( sio_recv_waiting( port )) {
  51.                             ch = sio_readbyte( port );
  52.                             putch( ch );
  53.                         }
  54.                         break;
  55.         }
  56.     } while ( 1 );
  57. }
  58. main()
  59. {
  60.     int comport = 1;        /* com port */
  61.     WORD port = 0x3f8;      /* its i/o port base */
  62.     int baud = 9600;
  63.     int irq = 4;
  64.     int temp;
  65.     DWORD dummy;
  66.     rt_init( 100 );
  67.     if (( comport = GetIniDWORD( "term.ini", "com", "port", 0 )) == 0 ){
  68.         comport = 1;
  69.         SetIniDWORD("term.ini","com","port", comport );
  70.     }
  71.     if ( comport == 2 ) {
  72.         port = 0x2f8;
  73.         irq = 3;
  74.     }
  75.     if (( baud = GetIniDWORD( "term.ini", "com", "baud", 0 )) == 0 ){
  76.         baud = 9600;
  77.         SetIniDWORD("term.ini","com","baud", baud );
  78.     }
  79.     sio_init( comport, port, irq, 4096, 4096, NULL, 0 );
  80.     sio_setup( comport, baud, 8, 0, 1, 1 );
  81.     cprintf("Press ~ to exitrn");
  82.     rt_newthread( kbd_thread, comport, 2048, 0, "keyboard thread" );
  83.     peer = rt_newthread( serial_thread, comport, 2048, 0, "serial input thread");
  84.     /* wait until we're done */
  85.     kreadmessage( &temp, &dummy );
  86.     sio_close( comport );
  87.     cprintf("rnDonern");
  88. }