You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DOSBox中通过串行UART端口正确传输字符?

解决DOS下UART串行端口字符传输问题

DOS提供了多种用于串行端口操作的中断(如INT 14H),但相关实操指南不多。我在测试Proteus模拟STM32项目的UART通信链路时,遇到了DOSBox中代码发送字符无响应的问题,现将解决方案整理如下:

测试链路回顾

我搭建的测试链路步骤:

  • 将虚拟终端连接到Proteus的COMPIM组件,配置对应波特率等参数后启动模拟
  • 使用com0com创建成对的虚拟空调制解调器串口,连接Proteus与DOSBox
  • 修改DOSBox配置文件,添加serial1=directserial realport:COM1映射真实串口
  • 在DOSBox中运行x86汇编代码发送字符,但无任何输出

原代码问题分析

原代码仅调用INT 14H完成初始化和发送操作,但忽略了两个关键环节:

  1. 初始化状态校验:未确认UART初始化是否成功,若端口映射或硬件配置有误,初始化会失败但代码未处理
  2. 发送前状态等待:未等待UART的发送保持寄存器为空就直接发送字符,导致字符无法被正确写入端口

正确实现方法

1. 确认链路配置正确性

  • 确保com0com创建的虚拟串口是成对的(如COM1和COM2),Proteus的COMPIM需连接到与DOSBox映射端口配对的串口(如DOSBox用COM1则Proteus用COM2)
  • DOSBox配置修改后需重启生效,检查serial1配置无拼写错误
  • Proteus虚拟终端的参数需与代码配置完全一致:2400波特率、8位数据位、无校验、1位停止位,关闭流控

2. 修正后的汇编代码

; 初始化COM1(DX=0对应COM1)
MOV AH, 0
MOV AL, 10100011B  ; 配置:2400波特、无校验、1停止位、8数据位
MOV DX, 0
INT 14H

; 检查初始化是否成功(帧错误、奇偶错误、溢出错)
TEST AH, 00001110B
JNZ INIT_FAILED    ; 存在错误则跳转到错误处理

; 等待发送保持寄存器为空
WAIT_SEND_READY:
MOV AH, 03H        ; 获取串口状态
MOV DX, 0
INT 14H
TEST AH, 00100000B ; 检查位5:传送保持寄存器是否为空
JZ WAIT_SEND_READY ; 未就绪则循环等待

; 发送字符'C'
MOV AH, 01H
MOV AL, 'C'
MOV DX, 0
INT 14H

; 检查发送是否成功
TEST AH, 00001110B
JNZ SEND_FAILED

; 正常流程后续代码
INIT_FAILED:
; 初始化错误处理(如提示错误)
SEND_FAILED:
; 发送错误处理

代码关键说明

  • 初始化校验:通过TEST AH, 00001110B检查返回状态中的错误位,确保UART端口初始化正常
  • 发送等待:调用INT 14H的AH=03H功能获取端口状态,等待发送保持寄存器为空后再执行发送操作,保证字符能被正确写入UART缓冲区
  • 发送后校验:发送完成后再次检查状态位,确认字符已成功发送

内容的提问来源于stack exchange,提问作者Moein Arabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:43:19