通过串行通信发送字符串UART-8250 x8086 [ASSEMBLY]

时间:2014-12-25 09:43:10

标签: assembly serial-port masm x86-16 serial-communication

=我正在使用DOSBOX,[TASM OR MASM对我的代码没有任何影响]。

好的,所以我正在开发一些串行通信代码游戏,它实际上有那个部分要求你的“用户名”,并等到另一个玩家输入他的名字,所以它会带你到主菜单。

问题在这里,我无法将“PlayerName”发送到另一台PC,并将其作为“PartnerName”接收。

这是我的代码的一部分:

Welcome proc   ;Welcome Screen !

mov al,03h
mov ah,00
int 10h

mov ah,02h
mov dh,10d
mov dl,20d
mov bh,00d
int 10h

mov ah,09h
lea dx,WelcomeMsg
int 21h

mov dh,11   ;Row number
mov dl,28   ;Column number
mov bh,0
mov ah,2
int 10h

;Reading PlayerName
mov ah,0ah
lea dx,PlayerName
int 21h

;Adding $ at the end, so we can print it later
mov bx,00
mov bl,PlayerName[1]
mov PlayerName[bx+2],'$'



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CHECKING FOR NAME;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SendingName:  ;Sending Player Name
; mov dx,3fdh
; in al,dx
; test al,01000000b
; jnz SendNameDone
; jmp SendingName
; SendNameDone:
; lea ax,[PlayerName]
; mov dx,3f8h   
; out dx,ax


; ReceivingName:  ;Receiving PLayer Name
; mov dx,3fdh
; in al,dx
; test al,00000001b
; jnz ReceiveNameDone
; jmp ReceivingName   ;This will occur if nothing is received.
; ReceiveNameDone:
; mov dx,3f8h
; in ax,dx
; mov si,ax
; mov di,OFFSET PartnerName
; mov cx,15
; movsb

; mov dh,1   ;Row number
; mov dl,1   ;Column number
; mov bh,0
; mov ah,2
; int 10h

; mov ah,09h
; lea dx,PartnerName
; int 21h

; mov ah,01h
; int 21h



;Confirm Message
mov dh,13   ;Row number
mov dl,18   ;Column number
mov bh,0
mov ah,2
int 10h

mov ah,09h
lea dx,WelcomeMsg2
int 21h

mov ah,01h
int 21h

ret
Welcome endp

如果您感到困惑,我的DataSegment就有一部分:

WelcomeMsg db 'Welcome, Please Enter Your Name: $'
WelcomeMsg2 db 'Please Press Any Key To Continue!$'

问题在于,我的“评论部分” - 我知道这是错误的 - 似乎确实陷入了无限循环。

如果您能提供帮助并告诉我如何在串行Comm上发送“PlayerName”并将其作为“PartnerName”接收..我会非常感激!

1 个答案:

答案 0 :(得分:0)

首先清除除数锁存访问位,以便使用发送器保持寄存器。

mov dx,03FBh        ;Line Control Register
in al,dx
and al,0111_1111b   ;Set DLAB=0
out dx,al

一次发送一个字节,检查发送器保持寄存器是否为空。

mov si,PlayerName+2 ;Send name including terminating $ character
SendingName:        ;Sending Player Name
mov dx,03FDh        ;Line Status Register
in al,dx
test al,0010_0000b  ;Use bit 5 to see if THR is empty
jz SendingName
lodsb
mov dx,03F8h        ;Transmitter Holding Register   
out dx,al
cmp al,"$"
jne SendingName