1

据我目前了解的串行端口,数据传输是通过引脚 3 完成的。如下所示: 串行端口引脚

有两件事让我对此感到不舒服。第一个是这似乎暗示两个连接的设备在信号速度上达成一致,第二个是即使它们被配置为以相同的速度运行,您也会遇到可能的同步问题......对吗?我想这样的事情可以处理,但似乎必须有一个更简单的方法。

对我来说似乎更好的方法是让其中一个串行端口引脚发送一个脉冲,指示下一位已准备好存储。因此,如果我们将这些引脚连接到移位寄存器,我们基本上有:(一些脉冲引脚)->clk,tx->d

这是一种常见的做法吗?有什么理由不这样做吗?

编辑

迈克不应该删除他的答案。这种I 2 C(2 针串行)方法似乎与我所做的非常接近。串行端口没有时钟你是对的 nobugz 但这基本上就是我所做的。看这里:

private void SendBytes(byte[] data)
{
    int baudRate = 0;
    int byteToSend = 0;
    int bitToSend = 0;
    byte bitmask = 0;

    byte[] trigger = new byte[1];
    trigger[0] = 0;

    SerialPort p;
    try
    {
        p = new SerialPort(cmbPorts.Text);
    }
    catch
    {
        return;
    }

    if (!int.TryParse(txtBaudRate.Text, out baudRate)) return;
    if (baudRate < 100) return;
    p.BaudRate = baudRate;

    for (int index = 0; index < data.Length * 8; index++)
    {
        byteToSend = (int)(index / 8);
        bitToSend = index - (byteToSend * 8);
        bitmask = (byte)System.Math.Pow(2, bitToSend);

        p.Open();
        p.Parity = Parity.Space;
        p.RtsEnable = (byte)(data[byteToSend] & bitmask) > 0;

        s = p.BaseStream;
        s.WriteByte(trigger[0]);

        p.Close();
    }
}

在有人告诉我这有多丑陋或我如何破坏传输速度之前,我的快速回答是我不在乎。我的观点是,这似乎比您在答案 nobugz 中描述的方法简单得多。如果 .Net SerialPort 类让我能够更好地控制引脚信号,它就不会那么难看。是否有其他串行端口 API 可以做到这一点?

4

2 回答 2

2

它已经以这种方式工作。每个字节先发送一个非数据起始位。这使接收器可以同步其时钟。并且至少有一个停止位,可以让接收器验证波特率并没有偏离到最后传输的数据位不可靠的程度。使用 8 个数据位,总共产生 10 个位,提供 10% 的波特率容差。关闭更多会产生框架错误。

早期的 PC 设计很容易利用这一点。UART 的时钟由便宜的晶体生成,该晶体存在于任何电视机中,用于同步色度载波与色同步,3.579545 MHz。振荡器将其除以 2,UART 将输入时钟除以 16,得到 3579545 / 32 = 111861 Hz。然后波特率除数选择频率,9600 波特的除数为 12。111861 / 12 = 9322 波特,误差为 2.9%。完全在 10% 的公差范围内。还解释了为什么 110,000 波特是最大值。

于 2010-01-30T08:47:11.223 回答
0

据我所知,该方法类似于此处描述的 I2C 方法。

于 2010-03-26T17:29:15.217 回答