これまでのシリアルポートを理解している限り、データの転送はピン 3 を介して行われます。ここに示すように:
これについて私が不快に思うことが2つあります。1 つ目は、接続されている 2 つのデバイスが信号速度に同意していることを暗示しているように思われることと、2 つ目は、それらが同じ速度で動作するように構成されていても、同期の問題が発生する可能性があることです...そうですか? そのようなものは処理できると思いますが、もっと簡単な方法が必要なようです。
私にとってより良いアプローチのように思われるのは、シリアルポートピンの1つに、次のビットを保存する準備ができていることを示すパルスを送信させることです. したがって、これらのピンをシフト レジスタに接続する場合、基本的に次のようになります: (いくつかのパルス ピン)->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 はありますか?