我最近掌握了ZX Spectrum +3,并试图使RS232与该频谱配合使用。我在电缆的插针(Spectrum 128 RS232数据电缆)here上插入了一根电缆(“ BT”型连接器<-> DB9串行器)。 电缆的另一端使用USB串行适配器连接到PC。我正在Linux上使用Moserial与Spectrum通信。
电缆正常工作,我可以使用LLIST
在串行端口上打印BASIC程序,但是即使启用了硬件握手(DTR / CTS),我也无法使Spectrum可靠地从串行端口读取)。
我用+3 BASIC编写了一个简单程序,将接收到的字符打印到屏幕上。似乎第一个字符已收到,但其余字符被删除或损坏。
以下是频谱尝试以300波特发送“ zx频谱”时输出的示例:
z[dot/box character]. VAL$ [box character]MOVE VAL$ VAL$ ?)
(看来VAL$
和MOVE$
在Spectrum的ROM中都是单个字符)
屏幕截图:
然后是BASIC程序,它打开串行端口,并将接收到的字符打印到屏幕上:
10 FORMAT LINE 300
20 FORMAT LPRINT "r"
30 FORMAT LPRINT "e"
40 OPEN #4,"p"
50 PRINT INKEY$#4;
60 GO TO 50
我发现,如果我从PC一次发送字符,并且字符之间有足够长的延迟,那么我可以从Spectrum获得更可靠的输出。我以不同的延迟对此进行了测试,而80ms的效果最佳。我真的不想使用这种方法作为解决方案-它的运行速度非常慢,有时会删除一些字符。
这可能是Spectrum本身的问题吗?还是我的设置中缺少某些内容?似乎有些不对劲,我知道有一个通过串行频谱的程序加载器-因此,可以肯定的是,该频谱必须能够接受串行输入,每个字符的延迟不超过80ms?
答案 0 :(得分:2)
ZX Spectrum Interface 1 通过位采样在软件循环中工作,具有延迟,因此它可以查找起始位,然后查找其他位。没有移位寄存器。这一切都是在软件中完成的。他们甚至不使用中断或其他某种固定的外部定时器来产生波特率延迟。
因此,它甚至不会开始寻找开始位,直到它知道您正在寻找输入......现在您已经知道发生了什么,我很确定您已经看到了有问题吗?如果您发送数据的速度太快,那么您的基本程序甚至没有时间返回到接收例程来查找起始位,而起始位将会丢失,或者更有可能的是,您将在字节中间拾取位转换并接收乱码...因此,您需要确保字节之间存在延迟,并且您的 Spectrum 在开始传输之前已准备好接收下一个字节。
希望这会有所帮助,即使它是很久以前的事,但其他人会发现这...
答案 1 :(得分:0)
在具有接口1的zx频谱48k中,我必须选择rs232的工作方式。 模式t:文本-> rx和tx仅7bit字符 模式b:字节-> RX和TX全字节(8位)
也许你必须che一下。
在带接口1的48k上 格式“ b”; 9600 然后,频谱以9600波特的速率在8位数据中工作。
在您的代码中,我看不到它将如何工作。
最诚挚的问候。
答案 2 :(得分:0)
我在尝试做同样的事情时遇到了你的问题!
您需要在您的 linux (PC) 应用程序中启用 RTS/CTS 握手,而不是 DTR/RTS。
这适用于我的 Spectrum+2:
100 REM ** Receive Test **
110 REM ** Use RTS/CTS **
120 CLS
130 FORMAT "p";9600
140 OPEN #4,"p"
150 PRINT INKEY$#4;
160 GO TO 150