据我所知,到目前为止,串口已通过引脚3传输数据。如下图所示:
有两件事令我不舒服。首先,它似乎暗示两个连接的设备在信号速度上达成一致,第二个是即使它们被配置为以相同的速度运行,也会遇到可能的同步问题......对吗?我认为这样的事情可以处理,但似乎必须有一个更简单的方法。
对我来说似乎更好的方法是让其中一个串行端口引脚发送一个脉冲,指示下一位已准备好存储。因此,如果我们将这些引脚挂接到移位寄存器,我们基本上有:(某些脉冲引脚) - > clk,tx-> d
这是一种常见做法吗?有什么理由不这样做吗?
编辑
迈克不应该删除他的答案。这种I2C (2 pin serial)方法似乎与我所做的非常接近。串口没有时钟你是对的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?
答案 0 :(得分: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波特是最大值。
答案 1 :(得分:0)
据我所知,该方法与<{3}}描述的I2C方法类似。