⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rterm.c

📁 一个演示串口通讯的例子
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>

#define  TRUE           1
#define  FALSE          0

#define  F1KEY          0x13b
#define  F2KEY          0x13c
#define  F10KEY         0x144

typedef unsigned char BYTE;
typedef unsigned char BOOL;

#include "rcomm.h"

COM_PORT        cpPort=CP_COM1;
unsigned long   nBaud=9600L;
COM_DATA_BITS   cdbBits=CDB_8_BITS;
COM_STOP_BITS   csbStop=CSB_1_BIT;
COM_PARITY      cpParity=CP_NO_PARITY;
char            *szStatusInfo[16]={ "DCD","RI","DSR","CTS","隓CD","隦I","隓SR","隒TS","RESERVED",
                                    "TX EMPTY","TX READY","BREAK","FRAMING ERROR","PARITY ERROR",
                                    "DATA OVERRUN","RX_READY" };

int  inkey( void )
{
    int     key=0;

    if ( kbhit() )
    {
        key=getch();
        if ( key==0 ) key=getch()+256;
    }

    return( key );
}

void emulate( void );
void OpenSerialPort( void );
void CloseSerialPort( void );

void main( int argc, char *argv[] )
{
    int         i,j;
    long        lValue;
    char        c;

    for ( i=1; i<argc; i++ )
    {
        if ( *argv[i]=='/' || *argv[i]=='-' )
        {
            switch( *(argv[i]+1) )
            {
                case 'h': case 'H': case '?':
                  printf( "\n     Usage:  TERM [/Cport] [/Bbaud] [/Ddbits] [/Pparity] [/Ssbits]\n" );
                  exit( 1 );
                  break;
                case 'c': case 'C':
                  if ( (c=*(argv[i]+2))>='1' && c<='4' ) cpPort=(int) (c-'1');
                  break;
                case 'b': case 'B':
                  lValue = atol( argv[i]+2 );
                  if ( lValue>0L ) nBaud=lValue;
                  break;
                case 'd': case 'D':
                  j = atoi( argv[i]+2 );
                  if ( j==8 || j==7 ) cdbBits=(j==8?CDB_8_BITS:CDB_7_BITS);
                  break;
                case 'p': case 'P':
                  switch( *(argv[i]+2) )
                  {
                      case 'N':
                      case 'n':
                          cpParity=CP_NO_PARITY;
                          break;
                      case 'O':
                      case 'o':
                          cpParity=CP_ODD_PARITY;
                          break;
                      case 'E':
                      case 'e':
                          cpParity=CP_EVEN_PARITY;
                          break;
                  }
                  break;
                case 's': case 'S':
                  j = atoi( argv[i]+2 );
                  if ( j==1 || j==2 ) csbStop=(j==1?CSB_1_BIT:CSB_2_BIT);
                  break;
                default:
                  printf( "\n\aError - Unknown parameter '%s'", argv[i] );
                  exit( 1 );
            }
        }
    }

    printf( "\n\nRocSoft (c) 1997 - RTERM Comms Test Utility\n\n" );
    printf( "Settings: COM Port   = COM%d\n", cpPort+1 );
    printf( "          Baud       = %lu\n", nBaud );
    printf( "          Parity     = %s\n", (cpParity==CP_NO_PARITY?"None":(cpParity==CP_ODD_PARITY?"Odd":"Even")) );
    printf( "          Data Bits  = %d\n", (cdbBits==CDB_8_BITS?8:7) );
    printf( "          Stop Bits  = %d\n", (csbStop==CSB_1_BIT?1:2) );
    printf( "Use RTERM /? for command line options\n" );
    printf( "Press F1  for port status info\n" );
    printf( "Press F2  for detailed port diagnostics\n" );
    printf( "Press F10 to exit\n\n" );
    emulate();
    printf( "\n\nRTERM (c) RocSoft 1997. Coded by CyberFrog.\n\n" );
}

/*=================================================================*/
/*                                                                 */
/*   Functions used by the main program are defined hereafter.     */
/*                                                                 */
/*=================================================================*/

void emulate( void )
{
    BYTE            cbChar;
    int             nQSize, key;
    BOOL            bAbort=FALSE;
    COM_STATUS      csStatus;

    OpenSerialPort();

    /* Infinite loop until we escape */

    while ( !bAbort )
    {
        /*  Look for characters received  */

        nQSize = COM_InQueue(cpPort);
        if ( nQSize )
        {
            if ( COM_Read(cpPort,&cbChar,1)==1 )
            {
                printf( "%c",cbChar );
            }
            else
            {
                printf( "\nRead Error\n" );
            }
        }

        if ( (key=inkey())!=0 )
        {
            switch( key )
            {
                case F10KEY:
                    bAbort=TRUE;
                    break;
                case F1KEY:
                    /*  Status  */
                    printf( "\nCOM%d Status:\n",cpPort+1 );
                    printf( "  InBuffer :%d\n",COM_InQueue(cpPort) );
                    printf( "  OutBuffer:%d\n",COM_OutQueue(cpPort) );
                    csStatus = COM_Status(cpPort);
                    printf( "  Status   :%04X\n\n",csStatus );
                    break;
                case F2KEY:
                    printf( "\nCOM%d Diagnostics:\n",cpPort+1 );
                    csStatus = COM_Status(cpPort);
                    for ( key=0; key<16; key++ )
                    {
                        if ( csStatus&(0x8000>>key) ) printf( "  %s\n",szStatusInfo[key] );
                    }
                    break;
                default:
                    if ( key<256 )
                    {
                        if ( COM_Write(cpPort,&key,1)!=1 )
                        {
                            printf( "\nWrite Error\n" );
                        }
                    }
            }
        }
    }

    CloseSerialPort();
}

void OpenSerialPort( void )
{
    if ( !COM_Open(cpPort,nBaud,cdbBits,csbStop,cpParity,2048) )
    {
        printf( "\n\aError opening COM port!\n" );
        exit( 1 );
    }
    atexit( CloseSerialPort );
    COM_IOCtrl( cpPort,TRUE,TRUE );
}

void CloseSerialPort( void )
{
    COM_Close( cpPort );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -