两台 PC 机之间的串口通信

来源:互联网 发布:linux怎么写shell脚本 编辑:程序博客网 时间:2024/05/19 14:39

两台 PC 通过串口进行数据传输,早有这方面的例程。
但是接收键盘操作,到对方的屏幕上进行显示,却不常见。
当然,现在的 QQ 聊天,已经司空见惯,但是当年,使用串口聊天,则是微机原理初学者的一个大难题。
做而论道多年前就编写出了这种程序,并且自己焊接了串口通信电缆,实验大获成功。
网上有个问题:http://zhidao.baidu.com/question/250153413.html
问到了这方面的问题,于是做而论道就把以前编写的程序,翻腾了出来,但愿对网友有所启示。
下面就是“收”、“发”两个程序。
;============================================================
; 程序名:
; 说明: 232接口通信(发送部分)
; 利用 PC 机串行口进行通信
; 本程序使用串行口2,需要外接 RS-232 电缆
;**************************************************;2K 堆栈区
STACK   SEGMENT PARA STACK 'STACK'
        DB  256  DUP('STACK   ')
STACK   ENDS
;**************************************************;数据区
DATA    SEGMENT PARA PUBLIC 'DATA'
MSG     DB 0DH,0AH,0DH,0AH,0DH,0AH
DB '        +----------------+               +----------------+',0DH,0AH
DB '        | How do         |               | How do         |',0DH,0AH
DB '        |     you do ?   |               |     you do ?   |',0DH,0AH
DB '        |                |               |                |',0DH,0AH
DB '        |        bye !   |               |        bye !   |',0DH,0AH
DB '        +----------------+               +----------------+',0DH,0AH
DB '          |            |                   |            |  ',0DH,0AH
DB '      +--------------------+           +--------------------+',0DH,0AH
DB '      |                    | -->->->-> |                    |',0DH,0AH
DB '      +--------------------+           +--------------------+',0DH,0AH
DB 0DH,0AH
DB '     This program let you TRANSMIT character to other computer.',0DH,0AH
DB 0DH,0AH,0DH,0AH
DB '  Copyright  2000-2003  by     All Rights Reserved',0DH,0AH
DB 0DH,0AH
DB '              Press ESC to finish this program.',0DH,0AH
DB 0DH,0AH
DB 'Please input :  $'
DATA    ENDS
;**************************************************;代码区
CODE    SEGMENT PARA PUBLIC 'CODE'
;_________________________________________________________
                                                 ;主程序区
MAIN    PROC  FAR         ;主过程
        ASSUME  CS:CODE,  DS:DATA,  SS:STACK,  ES:DATA
START:  PUSH  DS
        MOV   AX,  00H
        PUSH  AX
        MOV   AX,  DATA
        MOV   DS,  AX
        MOV   ES,  AX

        MOV   DX,  OFFSET  MSG  ;显示提示信息
        MOV   AH,  9
        INT   21H
        CALL  INITOUT     ;初始化串行口
K_IN:
        MOV   AH,  7
        INT   21H         ;接受键盘输入,不显示
        CMP   AL, 1BH
        JZ    EXIT_SEN    ;ESC退出
        MOV   BL,  AL
        MOV   DL,  AL
        MOV   AH,  2
        INT   21H         ;显示刚输入的字符

        CMP   BL,  0DH
        JNZ   FASONG      ;如果不是'回车符',转发送

        MOV   DL,  0DH    ;如是则回车换行
        MOV   AH,  2
        INT   21H         ;显示回车符
        MOV   DL,  0AH
        MOV   AH,  2
        INT   21H         ;显示换行符
FASONG:
        MOV   AL,  BL
        MOV   DX,  2F8H
        OUT   DX,  AL     ;发送数据
_WAIT1:
        MOV   DX,  2FDH   ;取线路状态寄存器
        IN    AL,  DX
        TEST  AL,  20H    ;测试 D5,为 1 则发送完毕
        JZ    _WAIT1
        JMP   K_IN
EXIT_SEN:
        MOV   DX,  2F8H
        MOV   AL,  03H
        OUT   DX,  AL     ;发送本文结束符

        MOV   AX,  4C00H  ;程序结束
        INT   21H
MAIN    ENDP
;_________________________________________________________
                                                 ;子程序区
INITOUT PROC  NEAR
        MOV   DX, 2FBH
        MOV   AL, 80H     ;设置写波特率除数锁存器
        OUT   DX, AL

        MOV   DX, 2F8H
        MOV   AL, 80H
        OUT   DX, AL

        MOV   DX, 2F9H
        MOV   AL, 01H     ;除数 = 0180H, 波特率 = 600
        OUT   DX, AL

        MOV   DX, 2FBH    ;设定数据格式
        MOV   AL, 0AH     ;奇校验、1位停止位、7位数据位
        OUT   DX, AL

        MOV   DX, 2FCH    ;设置 MODEN控制寄存器
;        MOV   AL, 1FH    ;1FH令8250进行回送, 调试用
        MOV   AL, 0FH     ;0FH令8250进行不回送, 通信用
        OUT   DX, AL

        MOV   DX, 2F9H    ;设置中断允许寄存器
        MOV   AL, 00H     ;禁止所有中断
        OUT   DX, AL

        RET
INITOUT ENDP
;_________________________________________________________
CODE    ENDS
        END   START
;============================================================
; 程序名:
; 说明: 232接口通信(接收部分)
; 利用 PC 机串行口进行通信
; 本程序使用串行口2,需要外接 RS-232 电缆
;**************************************************;2K 堆栈区
STACK   SEGMENT PARA STACK 'STACK'
        DB  256  DUP('STACK   ')
STACK   ENDS
;**************************************************;数据区
DATA    SEGMENT PARA PUBLIC 'DATA'
MSG     DB 0DH,0AH,0DH,0AH,0DH,0AH
DB '        +----------------+               +----------------+',0DH,0AH
DB '        | How do         |               | How do         |',0DH,0AH
DB '        |     you do ?   |               |     you do ?   |',0DH,0AH
DB '        |                |               |                |',0DH,0AH
DB '        |        bye !   |               |        bye !   |',0DH,0AH
DB '        +----------------+               +----------------+',0DH,0AH
DB '          |            |                   |            |  ',0DH,0AH
DB '      +--------------------+           +--------------------+',0DH,0AH
DB '      |                    | -->->->-> |                    |',0DH,0AH
DB '      +--------------------+           +--------------------+',0DH,0AH
DB 0DH,0AH
DB '     This program let you RECEIVE character to other computer.',0DH,0AH
DB 0DH,0AH,0DH,0AH
DB '  Copyright  2000-2003  by     All Rights Reserved',0DH,0AH
DB 0DH,0AH
DB '              Press ESC to finish this program.',0DH,0AH
DB 0DH,0AH
DB 'Please input :  $'
DATA    ENDS
;**************************************************;代码区
CODE    SEGMENT PARA PUBLIC 'CODE'
;_________________________________________________________
                                                 ;主程序区
MAIN    PROC  FAR         ;主过程
        ASSUME  CS:CODE,  DS:DATA,  SS:STACK,  ES:DATA
START:  PUSH  DS
        MOV   AX,  00H
        PUSH  AX
        MOV   AX,  DATA
        MOV   DS,  AX
        MOV   ES,  AX

        MOV   DX,  OFFSET  MSG  ;显示提示信息
        MOV   AH,  9
        INT   21H
        CALL  INITOUT      ;初始化串行口
_WAIT2:
        MOV   AH,  6       ;检查键盘输入(不等待)
        MOV   DL,  0FFH
        INT   21H
        CMP   AL,  1BH     ;是否 ESC
        JZ    EXIT_S       ;是则转到结束

        MOV   DX,  2FDH    ;取线路状态寄存器
        IN    AL,  DX
        TEST  AL,  01H     ;测试 D1, 为 1 则接收完毕
        JZ    _WAIT2

        MOV   DX,  2F8H
        IN    AL,  DX      ;取来数据
        MOV   BL,  AL      ;暂时存放

        CMP   BL,  03H     ;检查是否结束符
        JZ    EXIT_S       ;是则转到结束

        MOV   DL,  AL      ;显示数据
        MOV   AH,  2
        INT   21H

        CMP   BL,  0DH
        JNZ   _WAIT2       ;如果不是'回车符', 转继续

        MOV   DL,  0DH     ;如是则回车换行
        MOV   AH,  2
        INT   21H          ;显示回车符
        MOV   DL,  0AH
        MOV   AH,  2
        INT   21H          ;显示换行符

        JMP   _WAIT2       ;转继续等待

EXIT_S:
        MOV   AX,  4C00H   ;程序结束
        INT   21H
        RET
MAIN    ENDP
;_________________________________________________________
                                                 ;子程序区
INITOUT PROC  NEAR
        MOV   DX, 2FBH
        MOV   AL, 80H     ;设置写波特率除数锁存器
        OUT   DX, AL

        MOV   DX, 2F8H
        MOV   AL, 80H
        OUT   DX, AL

        MOV   DX, 2F9H
        MOV   AL, 01H     ;除数 = 0180H, 波特率 = 600
        OUT   DX, AL

        MOV   DX, 2FBH    ;设定数据格式
        MOV   AL, 0AH     ;奇校验、1位停止位、7位数据位
        OUT   DX, AL

        MOV   DX, 2FCH    ;设置 MODEN控制寄存器
;        MOV   AL, 1FH    ;1FH令8250进行回送, 调试用
        MOV   AL, 0FH     ;0FH令8250进行不回送, 通信用
        OUT   DX, AL

        MOV   DX, 2F9H    ;设置中断允许寄存器
        MOV   AL, 00H     ;禁止所有中断
        OUT   DX, AL

        RET
INITOUT ENDP
;_________________________________________________________
CODE    ENDS
        END   START
;============================================================
百度空间的字体、排版真不敢恭维,格式全乱了。
复制出去,到记事本中查看,格式就整齐了。

0 0
原创粉丝点击