serial port (2) 初始化com口

本文介绍了如何将COM口配置为中断模式和FIFO模式,详细阐述了设置过程,包括8259中断控制器、MCR、IER、FCR等寄存器的配置,以及中断使能、FIFO缓冲大小的设定。

如何让com口工作在中断模式:
1, 在8259中把com口对应的中断打开
2, MCR BIT3(OUT2)设1(X86架构)
3, IER 把需要的中断置起来,

如何让com口工作在FIFO模式:
1。设置FCR BIT0让COM知道下面是设置FIFO模式的命令。
2。设置FCR BIT7-BIT6 来决定缓冲大小
            0    0    1byte
            0    1    4byte
            1    0    8byte
            1    1    14byte
3. 设置FCR BIT3来 启动FIFO模式

下面这段代码就是初始化COM口,并工作在FIFO模式。


Sample Code

; Set IRQ enable and out2 to set enable interrupts
                                       
        mov     cl, COM_IRQ             ;
        mov     dx, 21h
        cmp     cl,7                    ; judge IRQ > 7
        jbe     short wlsp_00  
        mov     dx, 0a1h
        sub     cl, 8

wlsp_00:
        in      al, dx                  ; Program Interrupt Controller to

        mov     ah, 01
        shl     ah, cl
        xor     ah, 0FFh
        and     al, ah
        out     dx, al

        mov     cl, COM_IRQ             ;
        cmp     cl, 7
        jbe     wlsp_01

        in      al, 21h
        and     al, 0FBh
        out     21h, al

wlsp_01:

        mov     bh, MCR                 ; Modem Control Register
        call    Read_COM_Reg            ; Read the reg to

        mov     bh, MCR
        mov     bl, 008h                ; set out2 to set enable interrupts
        call    Prog_COM_Reg            ; Program the reg


; Set Enable Buad_Rate
        mov     bx, 0383h               ; Prog 3FB reg to
                                        ; Data Bits =8, Access baud rate generator
        call    Prog_COM_Reg


; Program the baud rate divisor
        mov     bh, 00h                 ; Prog 3FB reg to set
        mov     bl, DIVISER             ; Baud rate divisor LSB
        call    Prog_COM_Reg

 

        mov     bx, 0100h               ; Prog 3F9h reg to set
                                        ; Baud rate divisor MSB
        call    Prog_COM_Reg


; Reset DLAB, program 8 bits, 1 stop bit, no parity checking
        mov     bx, 0303h               ; 3FB, 8 Bits per char
        call    Prog_COM_Reg


; Program COM port Interrupt Enable Register
        mov     bx, 0100h               ; Prog 3F9 Reg to
                                        ; disable THRE, line status,
                                        ; modem-status-change, data available int
        call    Prog_COM_Reg


; FIFO Control Register
        mov     bx, 0201h               ; Prog 3FA reg to
                                        ; enable FIFOs
        call    Prog_COM_Reg

 

        mov     bx, 02C7h               ; Prog 3FA reg to
                                        ; 14-byte level trigger, TX FIFO reset,
                                        ; RX FIFO reset, enable FIFO
                                        ; Clear FIFOs, 14-byte level
        call    Prog_COM_Reg


; Interrupt Ident Register
        mov     bh, 02h                 ; 3FAh reg
        call    Read_COM_Reg

; Modem Conltrol Register
        mov     bx, 040Bh               ; Prog 3FC reg to
                                        ; Activate DTR, RTS, OUT2
        call    Prog_COM_Reg


; Interrupt Enable Register
        mov     bx, 010Fh               ; Prog 3F9 reg to
                                        ; enable THRE, line status,
                                        ; modem-status-change, data available int
        call    Prog_COM_Reg

; Line Status Register - LSR
; reset the LSR
; reset IIR
        mov     bh, 05h                 ; 3FDh reg
        call    Read_COM_Reg


; Modem Status Register - MSR
; reset MSR
; reset IIR
        mov     bh, 06h                 ; 3FEh reg
        call    Read_COM_Reg

系列文章连接
CMO 1

### 关于 Virtual Serial Port Driver 9.0 的错误解决方案 在使用 Virtual Serial Port Driver 9.0 创建虚拟 COM时,可能会遇到一些常见的错误。以下是可能的原因以及对应的修复方法。 #### 可能的报错原因 1. **不兼容性问题** 部分用户报告指出,某些应用程序(如 Qt 串助手)与 Virtual Serial Port Driver 9.0 存在兼容性问题[^2]。这可能是由于新版本引入的功能或更改破坏了旧版应用对其 API 的调用方式。 2. **配置不当** 如果未正确设置虚拟串参数(如波特率、数据位数等),可能导致通信失败或端不可用的情况[^1]。 3. **权限不足** Windows 操作系统的安全机制可能阻止软件访问硬件资源。如果以标准用户身份运行该工具,则可能出现无法创建或连接到虚拟 COM的现象。 4. **驱动冲突** 当系统中已安装其他第三方串管理程序时,它们之间可能发生冲突,从而引发异常行为。 --- #### 解决方案 ##### 方法一:降级至稳定版本 建议尝试回退到更稳定的版本(例如 7.2 或者 6.9)。这些早期版本已被广泛验证能够良好支持大多数开发环境下的需求。下载地址可以通过官方渠道获取。 ##### 方法二:调整权限级别 确保以管理员模式启动 `Configure Virtual Serial Port Driver` 工具。右键点击快捷方式并选择“以管理员身份运行”,这样可以赋予其足够的操作权限来修改系统设置。 ##### 方法三:重新初始化设备 有时简单的重启服务就能解决问题。具体步骤如下: - 打开命令提示符 (CMD),输入以下指令停止和启动相关服务: ```cmd net stop vsd_service net start vsd_service ``` ##### 方法四:检查日志文件 每款产品通常都会记录详细的执行过程以便排查故障所在位置。定位 `%AppData%\Eltechs\VSPE\Logs` 文件夹查看最新的 `.log` 文档内容寻找线索。 ##### 方法五:更新操作系统补丁 保持 Win7 更新至最新状态有助于消除潜在的安全隐患同时也改善整体性能表现。通过控制面板中的“Windows Update”功能完成必要的升级工作。 --- ### 示例代码片段 下面展示如何利用 Python 测试两个指定编号的虚拟串号是否正常工作的简单脚本: ```python import serial.tools.list_ports as lp def check_virtual_com(): ports = list(lp.comports()) for p in ports: if 'VSPD' in p.description: # 假设描述字段含有特定标志表明它是我们的目标对象之一 try: ser = serial.Serial(p.device, baudrate=9600, timeout=1) print(f"{p.device} is available.") ser.close() except Exception as e: print(f"Error accessing {p.device}: {str(e)}") check_virtual_com() ``` 此函数遍历当前计算机上所有的可用串行接,并特别关注那些由 VSPD 提供的服务实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值