1

これまでのシリアルポートを理解している限り、データの転送はピン 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 はありますか?

4

2 に答える 2

2

すでにこのように機能しています。各バイトは、最初に非データ スタート ビットで送信されます。これにより、レシーバーはクロックを同期できます。また、少なくとも 1 つのストップ ビットがあり、最後に送信されたデータ ビットが信頼できないほどボーレートがずれていないことを受信機が確認できます。データ ビットが 8 の場合、合計 10 ビットになり、ボーレートに 10% の許容誤差が生じます。それ以上ずれると、フレーミング エラーが発生します。

初期の PC 設計では、これをすぐに利用しました。UART のクロックは安価な水晶振動子によって生成され、カラー バーストからクロミナンス キャリアを同期させるためにどの TV セットにも存在し、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 に答える