两台 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
;============================================================
百度空间的字体、排版真不敢恭维,格式全乱了。
复制出去,到记事本中查看,格式就整齐了。