中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » dos可以和2000用串口传输文件吗?
作者:
标题: dos可以和2000用串口传输文件吗? 上一主题 | 下一主题
zzhbaby
初级用户





积分 48
发帖 12
注册 2006-1-11
状态 离线
『楼 主』:  dos可以和2000用串口传输文件吗?

我用的是dos6.22,我想用串口和win2000por传输数据,dos做服务器,该如何配置!!!请高手指点!

2006-1-14 20:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 2 楼』:  


───────────────── 版务记录 ─────────────────
执行:willsort
操作:移动主题:自《DOS疑難解答 & 問題討論 (解答室)》
说明:原版区三日内无回复,移动至此版区尝试
提示:原版区始终保留转向链接
───────────────── 版务记录 ─────────────────




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-1-17 11:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
FreeBuilder
初级用户





积分 33
发帖 11
注册 2006-1-30
状态 离线
『第 3 楼』:  

串口太慢了,并口可以吗?怎么做?

2006-2-3 22:53
查看资料  发送邮件  发短消息 网志  OICQ (496111886)  编辑帖子  回复  引用回复
jawbin
高级用户




积分 994
发帖 444
注册 2005-1-29
状态 离线
『第 4 楼』:  

可以啊

2006-4-17 18:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dijkstar
新手上路





积分 12
发帖 6
注册 2006-4-20
状态 离线
『第 5 楼』:  

头文件:
/*---------------------------------------------------------------------*
   FILENAME: GSERIAL.H
   This file is used to define const and class for GSERIAL.CPP

\*--------------------------------------------------------------------*/

#define COM1            1
#define COM2            2
#define COM3            3
#define COM4            4
#define COM5            5
#define COM6            6

#define COM1BASE        0x3F8   /*  Base port address for COM1  */
#define COM2BASE        0x2F8   /*  Base port address for COM2  */
#define COM3BASE        0x3E8   /*  Base port address for COM3  */
#define COM4BASE        0x2E8   /*  Base port address for COM4  */
#define COM5BASE        0x3A8   /*  Base port address for COM5  */
#define COM6BASE        0x2A8   /*  Base port address for COM6  */

/*
    The 8250 UART has 10 registers accessible through 7 port addresses.
    Here are their addresses relative to COM1BASE and COM2BASE. Note
    that the baud rate registers, (DLL) and (DLH) are active only when
    the Divisor-Latch Access-Bit (DLAB除数锁存器访问位) is on. The (DLAB)
        is bit 7 of the (LCR--Line Control Register线路控制寄存器).

        * TXR Output data to the serial port.
        * RXR Input data from the serial port.
        * LCR Initialize the serial port.
        * IER Controls interrupt generation.
        * IIR Identifies interrupts.
        * MCR Send contorl signals to the modem.
        * LSR Monitor the status of the serial port.
        * MSR Receive status of the modem.
        * DLL Low byte of baud rate divisor.
        * DHH High byte of baud rate divisor.
*/

/*The following is the adress of the registers               DLAB status        */
#define TXR             0       /*  Transmit register (WRITE)   0                        */
#define RXR             0       /*  Receive register  (READ)        0                        */
#define IER             1       /*  Interrupt Enable                        x                        */
#define IIR             2       /*  Interrupt ID                                x                        */
#define LCR             3       /*  Line control                                x                        */
#define MCR             4       /*  Modem control                                x                        */
#define LSR             5       /*  Line Status                                        x                        */
#define MSR             6       /*  Modem Status                                x                        */

#define DLL             0       /*  Divisor Latch Low                        1                        */
#define DLH             1       /*  Divisor latch High                        1                        */


/*-------------------------------------------------------------------*
  Bit values held in the Line Control Register (LCR).
        bit                meaning
        ---                -------
        0-1                00=5 bits, 01=6 bits, 10=7 bits, 11=8 bits.        /word length select bit
        2                Stop bits.                                                                        /       
        3                0=parity off, 1=parity on.                                        /Parity Enable=1
        4                0=parity odd, 1=parity even.                                /Odd or Even select
        5                Sticky parity.                                                                /
        6                Set break.
        7                Toggle port addresses.                                                /1:access
*-------------------------------------------------------------------*/
#define LCR_NO_PARITY       0x00
#define LCR_EVEN_PARITY     0x18
#define LCR_ODD_PARITY      0x08



/*-------------------------------------------------------------------*
  Bit values held in the Line Status Register (LSR).
        bit                meaning
        ---                -------
        0                Data ready.
        1                Overrun error - Data register overwritten.
        2                Parity error - bad transmission.
        3                Framing error - No stop bit was found.
        4                Break detect - End to transmission requested.
        5                Transmitter holding register is empty.
        6                Transmitter shift register is empty.
        7               Time out - off line.
*-------------------------------------------------------------------*/
#define LSR_RCVRDY          0x01
#define LSR_OVRERR          0x02
#define LSR_PRTYERR         0x04
#define LSR_FRMERR          0x08
#define LSR_BRKERR          0x10
#define LSR_XMTRDY          0x20
#define LSR_XMTRSR          0x40
#define LSR_TIMEOUT                        0x80

/*-------------------------------------------------------------------*
  Bit values held in the Modem Output Control Register (MCR).
        bit             meaning
        ---                -------
        0                Data Terminal Ready. Computer ready to go.
        1                Request To Send. Computer wants to send data.
        2                auxillary output #1.
        3                auxillary output #2.(Note: This bit must be
                        set to allow the communications card to send
                        interrupts to the system)
        4                UART ouput looped back as input.
        5-7                not used.
*------------------------------------------------------------------*/
#define MCR_DTR             0x01
#define MCR_RTS             0x02
#define MCR_INT                                0x08


/*------------------------------------------------------------------*
  Bit values held in the Modem Input Status Register (MSR).
        bit                meaning
        ---                -------
        0                delta Clear To Send.
        1                delta Data Set Ready.
        2                delta Ring Indicator.
        3                delta Data Carrier Detect.
        4                Clear To Send.
        5                Data Set Ready.
        6                Ring Indicator.
        7                Data Carrier Detect.
*------------------------------------------------------------------*/
#define MSR_CTS             0x10
#define MSR_DSR             0x20


/*------------------------------------------------------------------*
  Bit values held in the Interrupt Enable Register (IER).
        bit                meaning
        ---                -------
        0                Interrupt when data received.
        1                Interrupt when transmitter holding reg. empty.
        2                Interrupt when data reception error.
        3                Interrupt when change in modem status register.
        4-7                Not used.
*------------------------------------------------------------------*/
#define IER_RX_INT          0x01
#define IER_TX_INT          0x02


/*------------------------------------------------------------------*
  Bit values held in the Interrupt Identification Register (IIR).
        bit                meaning
        ---                -------
        0                Interrupt pending
        1-2             Interrupt ID code
                        00=Change in modem status register,
                        01=Transmitter holding register empty,
                        10=Data received,
                        11=reception error, or break encountered.
        3-7                Not used.
*------------------------------------------------------------------*/
#define IIR_MS_ID           0x00   // Modem status
#define IIR_RX_ID           0x04   // Rceived data OK,and to read the receive buffer
#define IIR_TX_ID           0x02   // Transmitter holding register empty
#define IIR_MASK                        0x07   // Get the low 3 bits of IIR


/*
        These are the port addresses of the 8259 Programmable Interrupt
    Controller (PIC).
*/
#define PIC8259_IMR             0x21   /* Interrupt Mask Register port */
#define PIC8259_ICR             0x20   /* Interrupt Control Port       */


/*
    An end of interrupt needs to be sent to the Control Port of
    the 8259 when a hardware interrupt ends.
*/
#define PIC8259_EOI            0x20   /* End Of Interrupt */




/*
        The (IMR) tells the (PIC) to service an interrupt only if it
        is not masked (FALSE).
*/
#define IRQ3            0xF7  /* COM2 */
#define IRQ4            0xEF  /* COM1 */


class serial{
   int flag;
   int  SetSerial();
   int  SetOthers(int Parity, int Bits, int StopBit);
   int  SetSpeed(int Speed);
   int  SetPort(int Port);
   void init_serial(void);
   void comm_on(void);
   void comm_off(void);
public:
   serial(int Port, int Speed, int Parity, int Bits, int StopBit);
   serial &operator<<( char ch );
   serial &operator<<( char *str );
   serial &operator>>( char &ch );
   ~serial();
};

#define VERSION 0x0101

#define FALSE                                0
#define TRUE                                1

#define NO_ERROR                        0       /* No error               */
#define BUF_OVFL                        1       /* Buffer overflowed      */

#define IBUF_LEN                        2048    // Incoming buffer
#define OBUF_LEN                        1024    // Outgoing buffer

extern int            SError          = NO_ERROR;
extern int            portbase        = 0;
extern void           interrupt(*oldvects[2])(...);

//        char  ccbuf[SBUFSIZ];
unsigned int   startbuf        = 0;
unsigned int   endbuf          = 0;
unsigned int   inhead          = 0;
unsigned int   intail          = 0;
unsigned int   outhead         = 0;
unsigned int   outtail         = 0;
        char  inbuf[IBUF_LEN];                        // in buffer
        char  outbuf[OBUF_LEN];                // out buffer

2006-4-20 17:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dijkstar
新手上路





积分 12
发帖 6
注册 2006-4-20
状态 离线
『第 6 楼』:  

实现文件:

  /*------------------------------------------------------------------*
          GSERIAL.CPP

          For asynchronous serial port communications

      ATTENTION: Compile this program with Test Stack Overflow OFF.
                                (TC++3: Options/Compiler/Entry
  *------------------------------------------------------------------*/

#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include "gserial.h"

#define VERSION 0x0101

#define FALSE                                0
#define TRUE                                1

#define NO_ERROR                        0       /* No error               */
#define BUF_OVFL                        1       /* Buffer overflowed      */

#define ESC                                        0x1B    /* ASCII Escape character */
#define ASCII                                0x007F  /* Mask ASCII characters  */
//#define SBUFSIZ                        0x4000  /* Serial buffer size     */
#define SBUFSIZ                                0x08        /* Serial buffer size     */
#define IBUF_LEN                        2048    // Incoming buffer
#define OBUF_LEN                        1024    // Outgoing buffer


void           interrupt(*oldvects[2])(...);

/*  get status of the port  */
int read_status_com(int portn)
{
  return(inp(portn+5));
}

/*  send one valid char from the port  */
void send_char_com(int portn,int cc)
{
   while ((read_status_com(portn) & 0x40) == 0);
   outportb(portn,cc);
}

/*  send one string from the port  */
void send_string_com(int portn,int strlen,unsigned char *buf)
{
        int k;        k=0;
   do {
           send_char_com(portn,*(buf + k));        k++;
          } while ((k < strlen));
}



void interrupt com_int(...)
{
        int temp;
        disable();
        temp = (inportb(portbase+IIR)) & IIR_MASK;                                // why interrupt was called
        switch(temp)
        {
                case 0x00:  // modem status changed
                        inportb(portbase+MSR);   // read in useless char
                        break;
                case 0x02:  // Request To Send char
                        if (outhead != outtail)                                                        // there's a char to send
                        {
                                outportb(portbase+TXR,outbuf[outhead++]);        // send the character
                                if (outhead == OBUF_LEN)
                                        outhead=0;                                                                // if at end of buffer, reset pointer
                        }
                        break;
                case 0x04:  // character ready to be read in
                        inbuf[inhead++] = inportb(portbase+RXR);// read character into inbuffer
                        if (inhead == IBUF_LEN) // if at end of buffer
                                inhead=0;           // reset pointer
                        break;
                case 0x06:  // line status has changed
                        inportb(portbase+LSR);     // read in useless char
                        break;
                default:
                        break;

        }

        outportb(PIC8259_ICR, PIC8259_EOI);        // Signal end of hardware interrupt
        enable();                                                        // reenable interrupts at the end of the handler

}



// Inserts the character to be outputted into the output buffer, checking
// for an open slot in the output buffer array.  If there is, insert
// the character, or if there isn't, wait until a slot opens up.
serial& serial::operator<<( char ch )
{
        if (ch)                                                                // If this is a valid char
        {
                enable();                                                // turn on irqs to ensure data output
                //outportb(portbase + MCR,  MCR_INT | MCR_DTR | MCR_RTS);//modem control,
                outportb(portbase + IER,  IER_RX_INT);
                // check buffer, and if full, wait for an available opening

        //        fprintf(stdout,"\n %c is pressed!\n",ch);   //You can use this to verify which key is hit during your test
                while((outhead-1==outtail) ||(outtail==OBUF_LEN-1 && outhead==0));
                disable();                                                // make sure nothing happens while changing buffer
                outbuf[outtail++] = ch;                        // insert character into buffer;
                if (outtail == OBUF_LEN)                // if at end of out buffer
                        outtail = 0;                                // reset pointer
                if((inportb(portbase+IER)&IER_TX_INT) == 0)
                        outportb(portbase+IER,IER_TX_INT | IER_RX_INT);
                enable();                       // re-enable interrupts
        }

        return(*this);
}


serial &serial::operator<<( char *str )
// Outputs a string to the serial port
{
        while (*str)
        {
                (*this) << (*str);
                str++;
        }
        return(*this);
}


serial &serial::operator>>( char &ch )
// Returns either the character to be received from modem if there is one
// waiting in the buffer, or returns a 0 if there is no character waiting.
{
        if (inhead != intail)     // there is a character
        {
                disable();                          // disable irqs while getting char
                ch = inbuf[intail++];               // get character from buffer
                if (intail == IBUF_LEN)                                // if at end of in buffer
                        intail=0;                                                // reset pointer
                enable();                           // re-enable interrupt
                return(*this);                      // return the char
        }
        ch = -1;
        return(*this);                          // return nothing
}



/* Install our functions to handle communications */
void setvects(void)
{
    oldvects[0] = getvect(0x0B);
        oldvects[1] = getvect(0x0C);
    setvect(0x0B, com_int);
        setvect(0x0C, com_int);
}

/* Uninstall our vectors before exiting the program */
void resvects(void)
{
    setvect(0x0B, oldvects[0]);
    setvect(0x0C, oldvects[1]);
}



/* Tell modem that we're ready to go */
void serial::comm_on(void)
{
    int temp, pnum;


        disable();
        temp = inportb(portbase + MCR) | 0x0f;//MCR_INT;
        outportb(portbase + MCR, temp);
        temp = (inportb(portbase + IER)) | IER_RX_INT;//|IER_TX_INT;
        outportb(portbase + IER, temp);
        pnum = (portbase == COM1BASE ? COM1 : COM2);
        temp = inportb(PIC8259_IMR) & (pnum == COM1 ? IRQ4 : IRQ3);
        outportb(PIC8259_IMR, temp);

//        temp = inportb(portbase + MCR) | MCR_DTR | MCR_RTS;
//        outportb(portbase + MCR, temp);
        enable();
}

/* Go off-line */
void serial::comm_off(void)
{
     int  temp;

    disable();
        temp = inportb(PIC8259_IMR) | ~IRQ3 | ~IRQ4;
    outportb(PIC8259_IMR, temp);
    outportb(portbase + IER, 0);
        outportb(portbase + MCR, 0);
        enable();
}

void serial::init_serial(void)
{
    endbuf = startbuf = 0;
        setvects();
        comm_on();
}

serial::~serial()
{
    comm_off();
    resvects();
}

/* Set the port number to use */
int serial::SetPort(int Port)
{
    int  Offset, far *RS232_Addr;

    switch (Port)
        { /* Sort out the base address */
      case COM1 :
                  Offset = 0x0000;
          break;
      case COM2 :
                  Offset = 0x0002;
                  break;
      default   :
                  printf("\ncannot find the serial port.\n");
                  return (-1);
    }

        RS232_Addr = (int far *)MK_FP(0x0040, Offset);  /* Find out where the port is. */
        if (*RS232_Addr == NULL)
        {
                printf("\ncannot find the serial port.\n");
                return (-1);                     /* If NULL then port not used. */
        }
    portbase = *RS232_Addr;              /* Otherwise set portbase      */

        return (0);
}

/* This routine sets the speed; will accept funny baud rates. */
/* Setting the speed requires that the DLAB be set on.        */
int serial::SetSpeed(int Speed)
{
        char        c;
    int                divisor;

    if (Speed == 0)            /* Avoid divide by zero */
        return (-1);
        else
        divisor = (int) (115200L/Speed);

    if (portbase == 0)
        return (-1);

    disable();
        c = inportb(portbase + LCR);
    outportb(portbase + LCR, (c | 0x80)); /* Set DLAB */
    outportb(portbase + DLL, (divisor & 0x00FF));
    outportb(portbase + DLH, ((divisor >> 8) & 0x00FF));
    outportb(portbase + LCR, c);          /* Reset DLAB */
        enable();

        return (0);
}

/* Set other communications parameters */
int serial::SetOthers(int Parity, int Bits, int StopBit)
{
        int  setting;

        if (portbase == 0)
                return (-1);
        if (Bits < 5 || Bits > 8)
                return (-1);
    if (StopBit != 1 && StopBit != 2)                       
                return (-1);
    if (Parity != LCR_NO_PARITY && Parity != LCR_ODD_PARITY && Parity != LCR_EVEN_PARITY)
                return (-1);

    setting  = Bits-5;
    setting |= ((StopBit == 1) ? 0x00 : 0x04);
        setting |= Parity;

        disable();
        outportb(portbase + LCR, setting);
    enable();

    return (0);
}

/* Set up the port */
serial::serial(int Port, int Speed, int Parity, int Bits, int StopBit)
{
        flag = 0;
        if (SetPort(Port))
          flag = -1;
        if (SetSpeed(Speed))
          flag = -1;
        if (SetOthers(Parity, Bits, StopBit))
          flag = -1;

        if (!flag)
           init_serial();
}

/*  Control-Break interrupt handler */
int c_break(void)
{
        int temp;
        disable();
        temp = inportb(PIC8259_IMR) | ~IRQ3 | ~IRQ4;
        outportb(PIC8259_IMR, temp);
        outportb(portbase + IER, 0);
        outportb(portbase + MCR, 0);
        enable();
        fprintf(stderr, "\nStill online.\n");
        return(0);
}

main()
{
        /* Communications parameters */
        int        port     = COM1;
        int        speed    = 9600;
        int        parity   = LCR_NO_PARITY;
        int        bits     = 8;
        int        stopbits = 1;
        int        done  = FALSE;
        char       c;
        int temp,i=0,j=0;

        serial comport(port, speed, parity, bits, stopbits);

        ctrlbrk(c_break);
        //for(i=0;i<OBUF_LEN;i++)
        //{
        //        outbuf[i] = 'a'+i;
        //}
        //static   char  outbuf[OBUF_LEN];                // out buffer

        fprintf(stdout, "TURBO C TERMINAL\n"
                        "...You're now in terminal mode, "
                        "press [ESC] to quit...\n\n");

        /*
           The main loop aMSR_CTS as a dumb terminal. We repeatedly
           check the keyboard buffer, and communications buffer.
        */
        do {
                if (kbhit())
                {
                        c=getch();
                        /* Look for an Escape key */
                        switch (c)
                        {
                                case ESC:
                                        done = TRUE;  /* Exit program */
                                        break;

                        //You may want to handle other keys here
                        }
                        if (!done)   comport<<c;
                        //send_char_com(portbase,c); //This is another send function,I add this function because some people (esp. older) don't like c++(they use c)
                }
                delay(50);
                comport >> c;
                if (c != -1)     //'-1' is the END signal of a string
                {
                        //fputc(c & ASCII, stdout);
                        fprintf(stdout,"%c",c);
                }

        } while (!done && !SError);

        /* Check for errors */
        switch (SError)
        {
                case NO_ERROR: fprintf(stderr, "\nbye.\n");
                                          return (0);

                case BUF_OVFL: fprintf(stderr, "\nBuffer Overflow.\n");
                                          return (99);

                default:      fprintf(stderr, "\nUnknown Error, SError = %d\n",
                                                          SError);
                                          return (99);
        }
}

2006-4-20 17:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dijkstar
新手上路





积分 12
发帖 6
注册 2006-4-20
状态 离线
『第 7 楼』:  

到龚建伟技术主页看看:http://www.gjwtech.com/serialcomm.htm

2006-4-20 17:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: