home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / comm / readcomm.c < prev    next >
C/C++ Source or Header  |  1988-08-10  |  5KB  |  145 lines

  1. /*
  2.  *  ReadComm
  3.  *  This program demonstrates the use of the function ReadComm.
  4.  *  It attempts to read a specified number of characters from the 
  5.  *  communication device that has already been opened and copy the 
  6.  *  characters into a buffer. Before attempting to do any read, the 
  7.  *  communication device must have its device control block set up 
  8.  *  properly to a correct configuration.
  9.  *
  10.  *  This program will only run properly if there is a dumb terminal connected
  11.  *  to COM1: port.
  12.  *
  13.  */
  14.  
  15. #include "windows.h"
  16.  
  17. /* Procedure called when the application is loaded for the first time */
  18. BOOL WinInit( hInstance )
  19. HANDLE hInstance;
  20. {
  21.     WNDCLASS   wcClass;
  22.  
  23.     /* registering the parent window class */
  24.     wcClass.hCursor        = LoadCursor( NULL, IDC_ARROW );
  25.     wcClass.hIcon          = LoadIcon (hInstance, (LPSTR)"WindowIcon");
  26.     wcClass.lpszMenuName   = (LPSTR)NULL;
  27.     wcClass.lpszClassName  = (LPSTR)"Readcomm";
  28.     wcClass.hbrBackground  = (HBRUSH)GetStockObject( WHITE_BRUSH );
  29.     wcClass.hInstance      = hInstance;
  30.     wcClass.style          = CS_HREDRAW | CS_VREDRAW;
  31.     wcClass.lpfnWndProc    = DefWindowProc;
  32.     wcClass.cbClsExtra     = 0;
  33.     wcClass.cbWndExtra     = 0;
  34.  
  35.     RegisterClass( (LPWNDCLASS)&wcClass );
  36.     return TRUE;        /* Initialization succeeded */
  37. }
  38.  
  39. int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow )
  40. HANDLE hInstance, hPrevInstance;
  41. LPSTR lpszCmdLine;
  42. int cmdShow;
  43. {
  44.     HWND    hWnd;          /* Handle to the parent window             */
  45.     short   nCid;          /* Short integer identifying the opened
  46.                             * communication device                    */
  47.     short   nBytes;        /* The number of characters read           */
  48.     char    szBuffer[20];  /* The buffer that is recieving the    
  49.                             * characters to be read                   */
  50.     HDC     hDC;           /* Handle to the DC of the client area     */
  51.     DCB     dcb;           /* The device control block                */
  52.     COMSTAT cstat;         /* The current status of the communication 
  53.                             * device                                  */
  54.        
  55.     WinInit( hInstance );
  56.  
  57.     hWnd = CreateWindow((LPSTR)"Readcomm",
  58.                         (LPSTR)"Read from Communication Devices",
  59.                         WS_OVERLAPPEDWINDOW,
  60.                         50,                /* x         */
  61.                         50,                /* y         */
  62.                         600,               /* width     */
  63.                         250,               /* height    */
  64.                         (HWND)NULL,        /* no parent */
  65.                         (HMENU)NULL,       /* use class menu */
  66.                         (HANDLE)hInstance, /* handle to window instance */
  67.                         (LPSTR)NULL        /* no params to pass on */
  68.                         );
  69.  
  70.     /* Make window visible according to the way the app is activated */
  71.     ShowWindow( hWnd, cmdShow );
  72.     UpdateWindow( hWnd );
  73.  
  74.     /* attempt to open the com1 port */
  75.     nCid = OpenComm ((LPSTR)"COM1", 20, 20);
  76.     if (nCid < 0) 
  77.       {
  78.          MessageBox (hWnd, (LPSTR)"Com port not opened!!",(LPSTR)"FAIL!",MB_OK);
  79.          return 0;
  80.       }
  81.  
  82.     /* the communication device control block must be set to the appropriate
  83.      * settings of the other dumb terminal in order to read and write
  84.      * properly
  85.      */
  86.     if (GetCommState (nCid, (DCB FAR *) &dcb) >= 0)
  87.       { dcb.BaudRate = 9600;
  88.         dcb.ByteSize = 8;
  89.         dcb.StopBits = ONESTOPBIT;
  90.         dcb.Parity   = NOPARITY;
  91.         dcb.fRtsflow = FALSE;
  92.         dcb.fDtrflow = FALSE;
  93.         dcb.fOutX    = FALSE;
  94.         dcb.fInX     = FALSE;
  95.         dcb.fNull    = FALSE;
  96.         dcb.XonLim   = 1;
  97.         dcb.XoffLim  = 20;
  98.       }
  99.  
  100.     SetCommState ((DCB FAR *) &dcb);
  101.  
  102.     /* Put something into the transmit queue of the dumb terminal */
  103.     MessageBox (hWnd, (LPSTR)"Type in something at the other terminal", 
  104.                 (LPSTR)"Quick", MB_OK);
  105.  
  106.     /* attempt to read from the recieve queue of the communication device */
  107.     nBytes = ReadComm (nCid, (LPSTR)szBuffer, 20);
  108.  
  109.     /* in case of an overflow of the recieve queue, GetCommError is 
  110.      * called to clear the error condition,; otherwise no other communication
  111.      * function will work properly
  112.      */
  113.     if (GetCommError (nCid, (COMSTAT FAR *) &cstat) == CE_RXOVER)
  114.       {  MessageBox (hWnd, (LPSTR)"Receive Queue overflow", (LPSTR)"ERROR!!", MB_OK);
  115.  
  116.          /* The error code must be cleared first before reading the receive 
  117.           * queue again
  118.           */
  119.          nBytes = ReadComm (nCid, (LPSTR)szBuffer, 20);
  120.       }
  121.  
  122.     /* Check to see if the read is successfully */
  123.     if (nBytes == 0)
  124.       MessageBox (hWnd, (LPSTR)"No character in the recieve queue",
  125.                     (LPSTR)"None Read", MB_OK);
  126.    
  127.     if (nBytes > 0)
  128.       { hDC = GetDC (hWnd);
  129.         TextOut (hDC, 10, 10, (LPSTR)szBuffer, nBytes);
  130.         ReleaseDC (hWnd, hDC);
  131.         MessageBox (hWnd, 
  132.                     (LPSTR)"Some characters read from the recieve queue",
  133.                     (LPSTR)"Read", MB_OK);
  134.       }
  135.   
  136.     if (nBytes < 0) 
  137.       MessageBox (hWnd, (LPSTR)"Nothing read", (LPSTR)NULL, MB_OK); 
  138.      
  139.  
  140.     /* must close the communication device before leaving the program */
  141.     CloseComm (nCid);
  142.  
  143.     return 0; 
  144. }
  145.