如何在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完成初始化和发送操作,但忽略了两个关键环节:
- 初始化状态校验:未确认UART初始化是否成功,若端口映射或硬件配置有误,初始化会失败但代码未处理
- 发送前状态等待:未等待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
相关产品推荐
相关产品推荐

