代码之家  ›  专栏  ›  技术社区  ›  Spencer Ruport

关于逻辑电路和串行通信的建议

  •  1
  • Spencer Ruport  · 技术社区  · 14 年前

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

    有两件事让我不舒服。第一,这似乎意味着两个连接的设备在一个信号速度上是一致的,第二,即使它们被配置成以相同的速度运行,也会遇到可能的同步问题…正确的?我想这类事情是可以处理的,但似乎必须有一个更简单的方法。

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

    这是惯例吗?有什么理由不这么做吗?

    编辑

    迈克不应该删除他的答案。这一方法似乎相当接近我所做的。串行端口没有时钟,你说得对,但这基本上就是我做的。请参阅:

    private void sendbytes(byte[]data)
    {
    int波特率=0;
    int字节发送=0;
    int位结束=0;
    字节位掩码=0;
    
    byte[]触发器=新字节[1];
    触发器〔0〕=0;
    
    串行端口P;
    尝试
    {
    p=新序列端口(cmbports.text);
    }
    抓住
    {
    返回;
    }
    
    如果(!)int.triparse(txtbaudrate.text,out baudrate))返回;
    if(波特率<100)返回;
    P.波特率=波特率;
    
    for(int index=0;index<data.length*8;index++)
    {
    byteToSend=(int)(索引/8);
    bittosend=索引-(byteTosend*8);
    位掩码=(byte)system.math.pow(2,bittosend);
    
    p);
    p.奇偶性=奇偶性空间;
    p.rtsenable=(字节)(数据[字节发送]&位掩码)>0;
    
    S=P.基流;
    s.writebyte(触发器[0]);
    
    p.关闭();
    }
    }
    

    在有人告诉我这有多难看或者我是如何破坏我的转会速度之前,我的快速回答是我不在乎。我的观点是,这似乎比你在回答Nobugz中描述的方法简单得多。如果.NET serialport类能给我更多的控制pin信号的话,就不会那么难看了。还有其他的串行端口API吗?

    有两件事让我不舒服。第一,这似乎意味着两个连接的设备在一个信号速度上是一致的,第二,即使它们被配置成以相同的速度运行,也会遇到可能的同步问题…正确的?我想这类事情是可以处理的,但似乎必须有一种更简单的方法。

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

    这是惯例吗?有什么理由不这么做吗?

    编辑

    迈克不应该删除他的答案。这个I2C (2 pin serial)方法似乎与我所做的相当接近。串行端口没有时钟,你说得对,但这基本上就是我做的。请参见这里:

    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类能给我更多的控制pin信号的话,就不会那么难看了。还有其他的串行端口API吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Hans Passant    14 年前

    它已经这样工作了。每个字节首先用一个非数据起始位传输。使接收器同步时钟。并且至少有一个停止位,它允许接收器验证波特率没有太高,以至于最后传输的数据位是不可靠的。对于8个数据位,它产生10个总位,在波特率上提供10%的公差。关闭更多会产生帧错误。

    早期的PC设计很容易利用这一点。UART的时钟是由一块便宜的晶体产生的,它存在于任何电视机中,用来同步彩色突发信号的色度载波,3.579545兆赫。振荡器将其除以2,UART将输入时钟除以16,得出3579545/32=111861 Hz。波特率除数然后选择频率,9600波特的除数是12。111861/12=9322波特,误差为2.9%。在10%的公差范围内。还解释了为什么最大波特率是110000。

        2
  •  0
  •   Spencer Ruport    14 年前

    据我所知,方法是 类似的 到所描述的I2c方法 here .