1


0

論理回路とシリアル通信に関するアドバイス

私がこれまでシリアルポートを理解している限り、データの転送はピン3を介して行われます。 ここに示されているように:image:https://jan.newmarch.name/internetdevices/embedded/9_PIN_PIN_OUT.GIF [Serial Port Pinout]

これについて私が不快に思う2つのことがあります。 1つは、接続されている2つのデバイスが信号速度に同意していることを意味するように思われ、2つ目は、同じ速度で実行するように構成されていても、同期の問題が発生する可能性があることです…​ 右? そのようなことは処理できると思いますが、もっと簡単な方法が必要なようです。

私にとってより良いアプローチのように思えるのは、次のビットを保存する準備ができていることを示すパルスをシリアルポートピンの1つに送信させることです。 したがって、これらのピンをシフトレジスタに接続する場合、基本的に次のようになります。(パルスピン)→ clk、tx→ d

これは一般的なやり方ですか? これをしない理由はありますか?

EDIT

マイクは答えを削除すべきではありませんでした。 このhttp://en.wikipedia.org/wiki/I2C#Timing_diagram[I2C(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はありますか?

2 Answer


2


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

初期のPC設計では、これをすぐに利用していました。 UARTのクロックは、カラーバースト3.579545 MHzからクロミナンスキャリアを同期するために任意のTVセットに存在する安価なクリスタルによって生成されました。 発振器はそれを2で除算し、UARTは入力クロックを16で除算して3579545/32 = 111861 Hzを生成します。 ボーレート除数は周波数を選択し、9600ボーの除数は12です。 111861/12 = 9322ボー、2.9%エラー。 10%の許容範囲内です。 また、110,000ボーが最大であった理由についても説明します。


0


私が知る限り、このアプローチはhttp://en.wikipedia.org/wiki/I%C2%B2C [こちら]で説明されているI2Cアプローチに類似しています。