Serial port ZX频谱-RS232(串行端口)问题

Serial port ZX频谱-RS232(串行端口)问题,serial-port,spectrum,z80,zxspectrum,sinclair,Serial Port,Spectrum,Z80,Zxspectrum,Sinclair,我最近得到了一个ZX频谱+3,并试图让RS232与频谱一起工作。我已经在电缆(Spectrum 128 RS232数据电缆)的引脚之后构建了一条电缆(“BT”型连接器DB9串行)。 电缆的另一端使用USB串行适配器连接到电脑。我在Linux上使用Moserial与Spectrum通信 电缆工作正常,我可以使用LLIST通过串行端口打印基本程序,但我无法可靠地从串行端口读取频谱-即使在Moserial中启用硬件握手(DTR/CTS) 我用+3 BASIC编写了一个简单的程序,将收到的字符打印到屏幕

我最近得到了一个ZX频谱+3,并试图让RS232与频谱一起工作。我已经在电缆(Spectrum 128 RS232数据电缆)的引脚之后构建了一条电缆(“BT”型连接器DB9串行)。 电缆的另一端使用USB串行适配器连接到电脑。我在Linux上使用Moserial与Spectrum通信

电缆工作正常,我可以使用
LLIST
通过串行端口打印基本程序,但我无法可靠地从串行端口读取频谱-即使在Moserial中启用硬件握手(DTR/CTS)

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

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

z[点/框字符]。VAL$[box character]移动VAL$VAL$?)

(似乎
VAL$
MOVE$
都是频谱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机上一个接一个地发送字符,它们之间有足够长的延迟,我可以从频谱中获得更可靠的输出。我测试了不同的延迟,80毫秒效果最好。我真的不想使用这种方法作为解决方案-它非常慢,有时会删除一些字符


这可能是频谱本身的问题吗?或者我的设置中缺少了什么?有些事情似乎不太对劲,我知道有一个程序加载器用于串行频谱-因此,肯定频谱必须能够接受串行输入,每个字符没有80ms延迟?

在zx spectrum 48k中,有接口1,我必须选择rs232的工作方式。 模式t:文本->仅接收和发送字符(7bit) 模式b:字节->接收和发送全字节(8位)

也许你必须核实一下

在48k上,接口1 格式“b”;9600 然后,频谱在9600波特的8位数据中工作

在你的代码中,我看不出will是如何工作的


向您致意。

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

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


希望这能有所帮助,尽管这已经是很久以前的事了,但其他人会发现这是如此…

我在尝试做同样的事情时遇到了你的问题

您需要在linux(PC)应用程序中启用RTS/CTS握手,而不是DTR/RTS

这对我的频谱+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

如果我这样做的话,我会首先关注频谱发射和PC接收。使用示波器测量实际波特率,以确认旧硬件晶体/振荡器的准确性。然后比较PC发送的波特率。“这里有一个例子,说明当试图以300波特发送‘zx Spectrum’时,频谱输出的内容”--你不是指接收后频谱显示的内容吗。。。?请保持您对输入/输出的看法一致。您使用的是什么USB-RS232适配器?您是否验证过它在其他设备上以低速工作?在300波特时,传输速度约为每秒30个字符,因此80ms仍然相当慢,但不是很大的因素。你能查一下收到的字符的十六进制/二进制值吗?然后将二进制值与发送字符的值进行比较-您可能有错误的参数(数据位数、奇偶校验、停止位数),并且接收的字符被“移位”。是的,这些“移动”等等被打印出来,因为接收到的字符是频谱中字节编码的“标记”。更好的输出十六进制值。@sawdust是的,这就是我的意思,对不起,这本可以用更好的措辞。您知道资源吗?那里有很多频谱专家。