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

📄 smalterm.cpp

📁 用C++写的RS232串口异步通讯功能模块
💻 CPP
字号:

/////////////////////////////////////////////////////////////////////////////
//     S M A L T E R M  --  D e m o   D r i v e r   f o r   M C O M M      //
//                         A s y n c   R o u t i n e s                     //
//                                                                         //
//                           Zortech C++ 2.0 Version                       //
//                           Turbo C++ 1.0 Version                         //
//                                                                         //
//             Mike Dumdei, 6 Holly Lane, Texarkana TX 75503               //
//                  Split Up the Middle BBS, 903 838-6713                  //
//                                                                         //
//              (Link with comm_s.lib for external functions)              //
//                     ztc smalterm.cpp comm.cpp comm_s.lib                //
//                     tcc smalterm.cpp comm.cpp comm_s.lib                //
/////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <process.h>
#include <stdarg.h>
#include <dos.h>
#include <bios.h>
#include <signal.h>

#include "comm.hpp"                 // header for AsyncPort class
#include "timer.hpp"                // header for Timer class
#include "ansivid.hpp"              // header for ANSI display functions
#define KEY_INT
#include "keys.h"                   // key definition header
#include "colors.h"                 // vid mode & color definition header
#include "extra.h"                  // extra functions header

#if defined(__TURBOC__)             // Turbo C++
  #define KBHIT   bioskey(1)
  #define KBREAD  bioskey(0)
  #define strcmpl stricmp
  #include <io.h>
#else                               // Zortech C++
  #define KBHIT   _bios_keybrd(1)
  #define KBREAD  _bios_keybrd(0)
#endif

#define NO_INPUT     (-1)
#define ESC_PRESSED  (-2)
#define TIMED_OUT    (-3)
#define NO_CARRIER   (-4)
#define ERROR_LIMIT  (-5)
#define GOT_CANNED   (-6)
#define BLK_COMP_ERR (-7)
#define BLK_SEQ_ERR  (-8)
#define CHECKSUM_ERR (-9)

#define TERMINAL       0
#define HOSTMODE       1            // hostmode isn't in here yet

#define SOH         '\x01'
#define STX         '\x02'
#define EOT         '\x04'
#define ACK         '\x06'
#define NAK         '\x15'
#define CAN         '\x18'

///////////////////////////////////////////////////////////////
//  function declarations in order found in source (random)  //
//:////////////////////////////////////////////////////////////
// void ControlBreakHandler(int sig);
int ProcessKeyPress();
void ProcessExtendedKey(int LongCh);
int ProcessAsyncChar();
int SaveScreen();
void RestoreScreen();
void VideoStatus(int saving);
void ClearScreen();
void ToggleLogFile();
void ToggleEcho();
void ToggleLineFeeds();
void ToggleDtr();
void DialNumber();
void DOS_Shell();
void DOS_Command();
void HostMode();
void MessageUpload();
void DSZUpload();
void DSZDownload();
void RunBatchFile(char *FileName);
void SendFile();
void ReceiveFile();
void ExitProgram();
int DisplayHelp();
void DisplayParameters();
void ChangeParameters();
int DrawBox(int Top, int Lft, int Height, int Length);
void RemoveBox();
int Prompt(char *Response, char *PromptMsg, int MaxResponse);
void HangUp();
int MonitoredDelay(int Ticks, int MonitorCarrier);
int WaitFor(char *String, int Ticks, int MonitorCarrier);
void vDisplay(char *Format, ...);
void vDisplay(int Color, char *Format, ...);
void vDisplay(int Row, int Col, char *Format, ...);
int PushScreen(int Row, int Col, int NbrRows, int NbrCols);
int PopScreen();
void ReceiveXmodem(char *FileName);
void SendXmodem(char *FileName, int BlockSize = 128);
void XmodemExitMsg(int rval);
int RxWithTimeOut(int Ticks);
void SetXmodemMode(char& save_xoff, char& save_flushbad, char *save_params);
void ResetXmodemMode(char& save_xoff, char& save_flushbad, char *save_params);
void SendCANs();
int WaitForBlockToEnd(int Ticks);
int GetHdrChar(int Ticks);
void TransferWindow(int Flag);

////////////////////////
//  global variables  //
////////////////////////
AsyncPort port(4096, 2048);     // port with 4K transmit, 2K receive buffers
char port_name[5];              // ASCII "COM1" or "COM2"
int port_number;                // assigned number COM1==0, COM2==1
int Mode;                       // identifies to subroutines HOST or TERMINAL
FILE *LogFile = NULL;           // handle for log file
char DialString[40];            // storage for dial string
int LineFeeds = 0;              // supply LineFeeds flag
int Echo = 0;                   // Echo on flag
int Dtr = 1;                    // DTR signal level flag
int cyn, hred, grn, hgrn;       // video color variables to enable support
int wht, hblu, ylw;             //   for either color or mono system
char vDispBuf[128];             // buffer for formatted display functions
char *ScreensArray[10];         // array of pointers for Push/Pop Screen
char ScreenIndex = 0;           // index of current pointer in above array


/////////////////////////////////////////////////
//  main                                       //
//://////////////////////////////////////////////
int cdecl main (int argc, char *argv[])
{
    char params[10], *pc;
    int got_port = 0, return_value, i;

    ////////////////////////////////////
    // process command line arguments //
    ////////////////////////////////////
    *params = '\0';                             // preset params to nul string
    for (i = 1; i < argc; i++)
    {
        pc = argv[i];                           // pointer to argument
        if (*pc == '-' || *pc == '/')
            ++pc;                               // skip any switch characters
        if (got_port == 0)
        {
            if (strcmpl(argv[i], "COM1") == 0)      // check for "COM1"
                got_port = 1;
            else if (strcmpl(argv[i], "COM2") == 0) // check for "COM2"
                got_port = 1, port_number = COM2;
        }
        if (isdigit(*pc) && strlen(pc) < 10)    // check for parameter string
            strupr(strcpy(params, argv[i]));
    }
    strcpy(port_name, (port_number == COM1) ? "COM1" : "COM2");

    ///////////////////////////
    // initialize the video  //
    ///////////////////////////
    initvid();                          // initialize lowlevel video variables
    if (v_mode != MONO && v_mode != CO80)
        setvmode(CO80);                 // reset video mode if necessary
    if (v_mode == CO80)
    {                                   // attributes to use if color system
        cyn = CYN, hred = H_RED, grn = GRN, hgrn = H_GRN,
        wht = WHT, hblu = H_BLU, ylw = YLW;
    }
    else
    {                                   // attributes to use if mono system
        cyn = WHT, hred = H_WHT, grn = WHT, hgrn = H_WHT,
        wht = WHT, hblu = H_WHT, ylw = H_WHT;
    }
    SaveScreen();

    /////////////////////////////
    // display sign on message //
    /////////////////////////////
    Display(hred, "SMALTERM - Sample driver for MCOMM library functions\n");
    Display(grn, "    Mike Dumdei, 6 Holly Lane, Texarkana TX 75503\n");
    Display("    Split Up the Middle BBS     903 838-6713\n");
    Display(hred, "Usage: smalterm {COM1 | COM2} {param str EX: 2400N81}\n\n");
    v_color = cyn;

    //////////////////////////
    // open the serial port //
    //////////////////////////
    return_value = port.Open(port_number, params);
    if (return_value != 0)                      // if port open failed
    {
        vDisplay(
          "SMALTERM: Can't open %s, Parameters: %s, Error code: %04X\n",
           port_name, (*params) ? params : "default", return_value);
        exit(return_value);
    }                                           // if port open succeeded
    vDisplay("SMALTERM: %s -- PORT OPENED\n\n", port_name);
    Display("Press F1 for HELP screen\n");

    //////////////////////////
    // miscellaneous set up //
    //////////////////////////
    tickhookset(1);                     // enable master tick in Timer class
/*  ControlBreakHandler(SIGINT);        // initialize control-break handler */
    SetWindowSize(0, 0, 23, 79);        // set window to protect status line
    Fill(24, 0, '

⌨️ 快捷键说明

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