home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Multimed / Multimed.zip / loadds7.zip / serial.c < prev    next >
C/C++ Source or Header  |  1997-07-12  |  3KB  |  169 lines

  1. /*
  2.  * serial.c - âVâèâAâïâ|ü[âgè╓îW
  3.  * loadds7 by Romy
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. #define INCL_BASE
  10. #define INCL_DOSDEVIOCTL
  11. #include <os2.h>
  12.  
  13. void
  14. COM_WaitRecv( HFILE hFile )
  15. {
  16.     RXQUEUE queParam;
  17.  
  18.     do{
  19.         DosDevIOCtl( hFile, IOCTL_ASYNC, ASYNC_GETINQUECOUNT,
  20.                     NULL, 0L, 0L, (PVOID)&queParam, sizeof(RXQUEUE),
  21.                     NULL );
  22.     }while( queParam.cch == 0 );
  23. }
  24.  
  25. void
  26. COM_WaitSend( HFILE hFile )
  27. {
  28.     RXQUEUE queParam;
  29.     CHAR sDummy[20];
  30.     ULONG ulDummy;
  31.     
  32.     /* Ä≤ÉMâoâbâtâ@é╠âfü[â^é≡ô╟é▌Ä╠é─éΘ */
  33.     DosDevIOCtl( hFile, IOCTL_ASYNC, ASYNC_GETINQUECOUNT,
  34.                 NULL, 0L, 0L, (PVOID)&queParam, sizeof(RXQUEUE),
  35.                 NULL );
  36.     if( queParam.cch > 0 ){
  37.         DosRead( hFile, sDummy, queParam.cch, &ulDummy );
  38.     }
  39.  
  40.     do{
  41.         DosDevIOCtl( hFile, IOCTL_ASYNC, ASYNC_GETOUTQUECOUNT,
  42.                     NULL, 0L, 0L, (PVOID)&queParam, sizeof(RXQUEUE),
  43.                     NULL );
  44.     }while( queParam.cch > 0 );
  45.  
  46. }
  47.  
  48. INT
  49. COM_SetBaudrate( HFILE hFile, USHORT usBaudRate )
  50. {
  51.     APIRET ulRet;
  52.  
  53.     /* Set Baudrate */
  54.     ulRet = DosDevIOCtl( hFile, IOCTL_ASYNC, ASYNC_SETBAUDRATE,
  55.                         (PVOID)&usBaudRate, sizeof(USHORT), NULL, NULL,
  56.                         0L, NULL );
  57.     if( ulRet != NO_ERROR ){
  58.         return -1;
  59.     }
  60.  
  61.     return 0;
  62. }
  63.  
  64. INT
  65. COM_Init( INT nComPort, HFILE* hFile )
  66. /*COMâ|ü[âgÅëè·ë╗(nComPort...1-4)*/
  67. /*û▀éΦÆl: 0...OK 1...Error*/
  68. {
  69.     ULONG ulAction;
  70.     APIRET ulRet;
  71.     LINECONTROL lineCtrl;
  72.     DCBINFO    dcbInfo;
  73.     CHAR szFile[10];
  74.  
  75.     /* Open COMport */
  76.     sprintf( szFile, "COM%1d", nComPort );
  77.     ulRet = DosOpen( szFile, hFile, &ulAction, 0L, FILE_NORMAL,
  78.             FILE_OPEN, OPEN_ACCESS_READWRITE|OPEN_SHARE_DENYNONE,
  79.             0L );
  80.     if( ulRet != NO_ERROR ){
  81.         return -1;
  82.     }
  83.  
  84.     /* Set BaudRate */
  85.     COM_SetBaudrate( *hFile, 9600u );
  86.  
  87.     /* Set Line Parameters */
  88.     lineCtrl.bDataBits = 8;
  89.     lineCtrl.bParity = 0x02;    /*Even Parity*/
  90.     lineCtrl.bStopBits = 0x00;    /*1 stop bit*/
  91.     lineCtrl.fTransBreak = 0x00;    /*Dont' send break*/
  92.     ulRet = DosDevIOCtl( *hFile, IOCTL_ASYNC, ASYNC_SETLINECTRL,
  93.                         &lineCtrl, sizeof(LINECONTROL), NULL, NULL,
  94.                         0L, NULL );
  95.  
  96.     if( ulRet != NO_ERROR ){
  97.         return -1;
  98.     }
  99.                         
  100.     dcbInfo.usWriteTimeout = 0;
  101.     dcbInfo.usReadTimeout = 0;
  102.     dcbInfo.fbCtlHndShake = 0;
  103.     dcbInfo.fbFlowReplace = 0;
  104.     dcbInfo.fbTimeout = MODE_NO_WRITE_TIMEOUT|MODE_READ_TIMEOUT;
  105.     dcbInfo.bErrorReplacementChar = '\0';
  106.     dcbInfo.bBreakReplacementChar = '\0';
  107.     dcbInfo.bXONChar = 0x11;    /*NoUse*/
  108.     dcbInfo.bXOFFChar = 0x13;    /*NoUse*/
  109.     ulRet = DosDevIOCtl( *hFile, IOCTL_ASYNC, ASYNC_SETDCBINFO,
  110.                         &dcbInfo, sizeof(DCBINFO), 0L, NULL,
  111.                         0L, NULL );
  112.     if( ulRet != NO_ERROR ){
  113.         return -1;
  114.     }
  115.  
  116.     return 0;
  117. }
  118.  
  119. INT
  120. COM_Close( HFILE hFile )
  121. {
  122.     ULONG ulRet;
  123.  
  124.     /* Close COMport */
  125.     ulRet = DosClose( hFile );
  126.  
  127.     if( ulRet != NO_ERROR ){
  128.         return -1;
  129.     }
  130.  
  131.     return 0;
  132. }
  133.  
  134. INT
  135. COM_SendString( HFILE hFile, CHAR sString[], ULONG ulLen )
  136. /* ulLenâoâCâgé╠âfü[â^é≡æùÉM */
  137. {
  138.     ULONG ulWrittenLen;
  139.     APIRET ulRet;
  140.     
  141.     COM_WaitSend( hFile );
  142.     ulRet = DosWrite( hFile, (PVOID)sString, (ULONG)ulLen, &ulWrittenLen );
  143.     if( ulRet != NO_ERROR ){
  144.         return -1;
  145.     }
  146.     else if( ulLen != ulWrittenLen ){
  147.         return -1;
  148.     }
  149.  
  150.     return (INT)ulLen;
  151. }
  152.  
  153. INT
  154. COM_RecvString( HFILE hFile, CHAR sString[], ULONG ulLen )
  155. /* ulLenâoâCâgé╛é»âfü[â^Ä≤ÉM */
  156. {
  157.     ULONG ulReadLen;
  158.     APIRET ulRet;
  159.  
  160.     COM_WaitRecv( hFile );
  161.     ulRet = DosRead( hFile, (PVOID)sString, (ULONG)ulLen, &ulReadLen );
  162.     if( ulRet != NO_ERROR ){
  163.         return -1;
  164.     }
  165.  
  166.     return (INT)ulReadLen;
  167. }
  168.  
  169.