IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Direct I/O in DOSBOX for COMM serial communications with QBasic TBasic or Pbasic -> 正文阅读

[嵌入式]Direct I/O in DOSBOX for COMM serial communications with QBasic TBasic or Pbasic

DOSBOX虚拟环境能在WIN10和LINUX平台上支持DOS、WIN3x、Win9x程序运行。串口是当年计算机硬件的标配,经RS232-RS485转换后轻松实现远距离数据通讯,这些当年的程序和设备在今天的DOSBOX下也还是可以使用的。DOS、QuickBasic、TurboBasic、PowerBasic,都曾经陪伴了许多人的青春年华,回味起来既温馨又充实,至今依然很耐人玩味,因此,还是把心得体会写下来。

DOSBOX不仅支持串口,还支持打印口和游戏口。串口和打印口都有Direct I/O能力,游戏口也是如此,而DOSBOX中的程序大多是实模式下运行的,通过Direct I/O即可在串口、并口、游戏口的支持下与外部硬件打交道(其它非标口是不行的)。在QBasic、TBasic、PBasic的On COM(n), On Strig(n)支持下,串口游戏口又都是优于60ms的中断源,合理安排下做中断处理还是比较容易使用的(优先级高的中断会中断优先级低的中断)。反正就是拿它玩的,也不必纠结太多其它什么东西,能用就好。

想让DOSBOX支持串口,要在它的CONF文件中配置一下串口。真实串口要映射成DOSBOX的串口,一般就一对一好了。将serial1?????? = dummy改成serial1?????? = directserial realport:COM1,这样真实串口就挂到了DOSBOX的串口serial1,即DOSBOX的COM1口。

[Serial]

serial1?????? = directserial realport:COM1

串口通讯是既让人兴奋又让人讨厌的东西,无论你在哪个BASIC下常规使用它都有毛病,在数据读取时会出问题,要么缓冲区溢出程序不运行了,要么串口线断线程序死着不动了。研华的STD-DRV能支持四个普通串口,在DOS下调用它的函数比BASIC带的OPEN类的东西好用多了,它是不加密的,移动哪个DOS下都能使用,而用还带C、BASIC、CLIPPER等SAMPLE程序。只是,把它用到DOSBOX下时就不好用了。其实,直接操作串口的状态和数据寄存器就方便了,而且DOSBOX支持这种直接操作。下面是个TuroBasic的实验程序,在其它BASIC下应该也是运行的,这些平台都差不多而且应该是代码兼容的。

ON ERROR GOTO ERRORTRAP1
'TURBOBASIC DOESN'T ALLOW ON_ERROR_ RESUME_NEXT, USE GOTO INSTEAD

CLS
     'SET COM1 BAUD RATE AND MODE
     OUT &H3F8 + 3, &H80
     OUT &H3F8 + 0, &H0C
     OUT &H3F8 + 1, &H00
     OUT &H3F8 + 3, &H03
     OUT &H3F8 + 4, &H00
     OUT &H3F8 + 1, &H00

     ZZZ=32
     DO WHILE INKEY$<>CHR$(27)
     ZZZ = ZZZ + 1

     FOR L = 1 TO 1000
     COMSTATUSOUT = INP(&H3F8 + 5)
     IF (COMSTATUSOUT AND &H20) = &H20 THEN
        OUT &H3F8, ZZZ
        EXIT FOR
     END IF
     NEXT L

     IF ZZZ >= 126 THEN ZZZ = 32

      FOR L = 1 TO 1000
      COMSTATUSIN = INP(&H3F8+5)
      IF (COMSTATUSIN AND 1) <> 0 THEN
          FFF$ = CHR$(INP(&H3F8)): PRINT FFF$+" ";
          EXIT FOR
      END IF
      NEXT L

     LOOP
END

'TURBOBASIC DOESN'T ALLOW ON_ERROR_ RESUME_NEXT, USE A SUBROUTINE INSTEAD
ERRORTRAP1:
      RESUME NEXT

这段程序是寄存器直接发送和接收,然后显示ASCII字符到屏幕上。因为不存在INPUT类的内部等待,和其它封闭起来的毛病,因此,即使是串口线断了,最多是收不到数据,一旦恢复连接则数据又开始接收了,这在与外部硬件实时打交道时可靠多了。如果发送端定义成!nnn#类指令,那收到指令时可按指令行事了,与Adam或NuDam模块类似了,与单片机打交道也可以如此操作。看看它的实际输出吧。

?

这是将九针串口的2和3脚,TxD和RxD连在一起得到的即时收发反应,正常情况下是稳稳的不丢失字符的。

除了如此操作之外,DOSBOX还可借助PCAP或SLIRP联网,不过是有局限的。毕竟DOSBOX不是基于虚拟网卡结构的,它没有虚拟网上就只能寄生在物理网卡,从底层收发数据,就是CAP抓包数据或叫截获数据,这网联得好像不怎么正道似的,但却是能联接上网的。

另外就是共享数据,DOSBOX和主机WINx用的是相同的文件系统,通过对文件系统的加解锁就可以将砂箱DOSBOX中的数据文件共享给主机程序读取。DOSBOX对文件加锁,写完数据关闭文件,释放文件锁;主机程序加锁文件,读取数据,并释放文件锁。这种方法做大数据交换还算方便吧,怎么也比串口收发数据方便,如果Mount的是Ramdisk那还可以不停的读写操作提高数据交换的即时性。

总之,DOS虽然老,但在64位Win10和Linux上还是能用的。相比Mono和Wine, DOSBOX轻便多了,不用建一堆Windows的目录结构和注册表。Watcom c/c++带上Pmode/W,DOSBOX下的DOS也能保护模式编程,上Win3x和Win9x也挺好玩的。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:09:12  更:2021-10-17 12:09:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:34:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码