1

我最近得到了一个 ZX Spectrum +3 并试图让 RS232 与该频谱一起工作。我在此处的电缆(Spectrum 128 RS232 数据电缆)的引脚之后构建了一根电缆('BT' 型连接器 <-> DB9 串行) 。电缆的另一端使用 USB 串行适配器连接到 PC。我在 Linux 上使用 Moserial 与 Spectrum 进行通信。

电缆工作正常,我可以用来LLIST通过串行端口打印 BASIC 程序,但我无法让 Spectrum 可靠地从串行端口读取 - 即使在 Moserial 中启用硬件握手 (DTR/CTS) 时也是如此。

我用 +3 BASIC 编写了一个简单的程序,将接收到的字符打印到屏幕上。似乎第一个字符接收正常,但其余字符被丢弃或损坏。

以下是尝试以 300 波特发送“zx 频谱”时频谱输出的示例:

z[dot/box character]. VAL$ [box character]MOVE VAL$ VAL$ ?)

(看起来VAL$并且MOVE$每个都是 Spectrum ROM 中的单个字符)

截屏: https://i.stack.imgur.com/D0TMW.jpg

以及打开串口并将接收到的字符打印到屏幕上的 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 效果最好。我真的不想使用这种方法作为解决方案 - 它非常慢,偶尔会丢失一些字符。

这可能是频谱本身的问题吗?还是我在设置中遗漏了什么?有些事情似乎不对,我知道有一个用于串行频谱的程序加载器 - 所以频谱肯定能够接受串行输入而每个字符没有 80 毫秒的延迟?

4

4 回答 4

2

ZX Spectrum Interface 1 在软件循环中通过位采样工作,具有延迟,因此它可以查找起始位,然后查找其他位。没有移位寄存器。这一切都是在软件中完成的。他们甚至不使用中断或其他类型的固定外部定时器来产生波特率延迟。

结果,它甚至不会开始寻找开始位,直到它知道您正在寻找输入......现在您已经知道发生了什么我很确定您已经看到了那里的问题?如果您发送数据的速度太快,那么您的基本程序甚至没有时间返回接收例程来查找起始位,并且起始位将会丢失,或者更有可能的是,您将拾取中间字节的位转换并接收乱码......因此,您需要确保字节之间存在延迟,并且您的 Spectrum 已准备好在开始传输之前接收下一个字节。

希望这会有所帮助,即使是不久前,但其他人会发现这...

于 2021-02-13T01:37:39.117 回答
0

在 zx 频谱 48k 中,使用接口 1,我必须选择 rs232 的工作方式。模式 t : text -> rx and tx only character in 7bit Mode b: byte -> rx and tx full byte (8 bit)

也许你必须检查一下。

在 48k 上,接口 1 FORMAT "b";9600 然后,频谱以 9600 波特的 8 位数据工作。

在您的代码中,我看不到将如何工作。

我最诚挚的问候。

于 2020-05-29T04:12:03.117 回答
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
于 2021-05-02T12:46:40.883 回答
0

在进行串行通信时,现代计算机和 ZX Spectrum 之间存在软件不兼容问题。它可以修复,但不能从 Basic 修复。RTS/CTS 的问题在于,在 Spectrum 发出信号后,它无法通过 CTS 信号接收更多数据:现代 UART 芯片会假设接收计算机仍然能够接收 cca。一个数据缓冲区(= 最多 32 个字节)。但是 ZX Spectrum 只有 1 个字节的缓冲区。因此,当 Spectrum 说它已满时,它将被额外的 32 字节数据淹没。

这就是为什么任何比 1200 波特更快的东西都不能从 BASIC 工作的原因。但是......我让 ZX Spectrum 在 57600 可靠地运行,并在 115200 进行纠错。在我向 PC 发出停止发送数据的信号后,只需期望最多 32 个字节。

于 2021-09-06T15:48:28.780 回答