オシロスコープからシリアルデータを読み取る方法


21

マイクロコントローラー(PICAXE 20X2)とポットメーターがあります。マイクロをプログラムして、ポットメーターの変更をPCのシリアルポートに送信します。明らかに8ビットADCです。今、私にとって興味深いのは、オシロスコープでこのシリアルデータをデコードできることです。

ここに2つの画像があります。最初の画像はマイクロがPCに「0」を送信しているときで、次の画像は「255」を送信しているときです。データは9600 buadを使用して送信されており、PC端末で受信できます。

最初の写真 ここに画像の説明を入力してください

2枚目の写真 ここに画像の説明を入力してください

だから私の質問は、自分のスコープで正しいデータをキャプチャしたのか、次にこのパルスを16進形式またはASCII形式に読み取ってデコードできるのかということです。この立ち上がりパルスと立ち下がりパルス(0/1)の読み方を意味します。

ありがとう。


3
シリアル回線は論理「1」状態でアイドル状態になります。したがって、ここでは、下部に1があり、上部に0があることに注意してください。私はすでに人々がそれに固執していることを知っています。私のコメントは、シリアルデータの将来の範囲を把握するためのものです。アイドル状態が高くなるように物事を調べることができます。
ジャストジェフ

回答:


14

最初にオーリンも気づいたこと:レベルは、マイクロコントローラーが通常出力するものの逆です:

ここに画像の説明を入力してください

心配する必要はありません。この方法でも読み込めることがわかります。スコープでは、スタートビットが1ストップビットになり0ます。

μμμ1μ0

0x001μ
0xFFμ

推測値:

0b11001111 = 0xCF
0b11110010 = 0xF2

0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2

編集
Olinは絶対に正しいです。これはASCIIのようなものです。実際のところ、ASCII の1の補数です。

0xCF〜0x30 = '0'
0xCE〜0x31 = '1'
0xCD〜0x32 = '2'
0xCC〜0x33 = '3'
0xCB〜0x34 = '4'
0xCA〜0x35 = '5'

0xF2〜0x0D = [CR]

これは、スクリーンショットの私の解釈が正しいことを確認します。


編集2(一般的な要求に応じてデータを解釈する方法:-))
警告:これは長い話です。これは、このようなものをデコードしようとすると頭の中で起こることの転写であるためです。それに取り組むための1つの方法を学びたい場合にのみ読んでください。

例:2つの狭いパルスから始まる、最初のスクリーンショットの2番目のバイト。最初のバイトよりもエッジが多いため、意図的に2番目のバイトから開始します。各狭パルスは約1/10分割されているため、それぞれが1ビット高く、その間に低ビットがあります。また、これより狭いものは見当たらないので、1ビットだと思います。それが参考です。
その後、101低レベルでの期間が長くなった後。広い以前のものと同様に約2倍に見えますが、そのためには、可能性があり00。それに続く高さは再び2倍の幅になります1111。これで9ビットになりました:開始ビット(1)+ 8データビット。次のビットはストップビットになりますが、0すぐには見えません。したがって1010011110、開始ビットと停止ビットを含めて、すべてをまとめることができます。ストップビットがゼロにならない場合、どこかで悪い仮定をしたでしょう!
私たちは、8つのデータビットを反転させる必要がありますので、UARTは最初のLSB(最下位ビット)を送ることに注意してください:11110010= 0xF2

これで、シングルビット、ダブルビット、および4ビットシーケンスの幅がわかったので、最初のバイトを確認しました。最初の高周期(幅の広いパルス)は1111、2番目のバイトよりわずかに広いため、5ビット幅になります。それに続くロー期間とハイ期間は、それぞれ他のバイトのダブルビットと同じ幅なので、を取得し111110011ます。再び9ビットなので、次のビットは低ビット、つまりストップビットでなければなりません。私たちのguesstimatingが正しいかどうかのOKということなので、我々は再びデータビットを逆にすることができます:11001111= 0xCF

その後、Olinからヒントを得ました。最初の通信は2バイト長で、2番目の通信より2バイト短いです。また、「0」は「255」よりも2バイト短くなっています。したがって、正確ではありませんが、おそらくASCIIのようなものです。また、「255」の2番目と3番目のバイトが同じであることに注意してください。素晴らしい、それは二重の「5」です。元気です!(時々自分自身を励まさなければなりません。)「0」、「2」、「5」をデコードした後、最初の2つのコードには2の違いがあり、最後の3つには3の違いがあることに気付きます。二。そして最後に、これがASCIIの数字のパターンである0xC_の補数であることに気付きました0x3_


ヒントをありがとう、正しい波形をキャプチャして、質問を更新してみます。
ショーン87

ありがとう、あなたはそれらのデータを見つける方法のように絵をマークしてもいいですか?
ショーン87

1
@ Sean87-それは長い話になったので、答えに追加しました。これは私のやり方を示しており、他の方法もあります。あなたがそれの半分を見なかったと思うならば、心配しないでください。そのほとんどは単なる経験と想像力です。関連する特別なインテリジェンスはありません。
-stevenvh

とても良い答えと質問ですが、なぜオシロスコープが実際に何が反転していると言ったのか不思議に思っています。アイドルラインはほとんど常に高いことを知っていますが、オシロスコープは実物の正確な画像をキャプチャするはずではありませんか?ユーザーがオシロスコープの設定のパラメーターを変更した場合を除きます。
ニコス

7

何かが足りません。信号は3.3Vのピークツーピークであるように見えます。これは、信号がマイクロから直接出ていることを意味します。ただし、マイクロコントローラのUARTレベルは(ほぼ)常にアイドル状態のハイでアクティブロウです。あなたの信号はそれから反転されていますが、これは意味をなしません。

最終的にこのデータをPCに取り込むには、RS-232レベルに変換する必要があります。これは、PC COMポートが期待するものです。RS-232はアイドル状態でローでアクティブハイですが、ローは-5V未満で、ハイは+ 5Vを超えています。幸いなことに、典型的なマイクロコントローラロジックレベルのUART信号とRS-232の間の変換を容易にするチップがあります。これらのチップにはチャージポンプが含まれており、3.3V電源からRS-232電圧を生成します。これらのチップは一般的に「MAX232」と呼ばれることがあります。これは、そのタイプの初期の人気のあるチップの部品番号だったためです。5Vではなく3.3Vの電力を使用しているため、別のバリアントが必要です。基本的に、これらのチップの1つである製品を、コネクタ付きのボード上に作成します。http://www.embedinc.com/products/rslink2にアクセスますそして、そのようなチップを接続する方法の一例を見るために回路図を見てください。

合計しないもう1つのことは、0と255のみを送信していると言っても、両方のシーケンスが1バイト以上であるように見えることです。このタイプのシリアルデータは、スタートビット、8データビット、次にストップビット。スタートビットは、常にラインアイドルレベルとは反対の極性です。ほとんどの説明では、回線のアイドルレベルは「スペース」と呼ばれ、反対は「マーク」と呼ばれます。したがって、開始ビットは常にマークされています。開始ビットの目的は、残りのビットの時間同期を提供することです。双方がビットの長さを知っているので、唯一の問題はバイトの開始がいつであるかです。スタートビットはこの情報を提供します。レシーバは基本的に、スタートビットのリーディングエッジでクロックを開始し、それを使用してデータビットがいつ到着するかを認識します。

データビットは、マークが1でスペースが0の最下位に送信されます。スペースレベルのストップビットが追加され、次のスタートビットの開始が新しいエッジになり、少し時間を空けます。バイト間。これにより、送信者と受信者の間の小さなエラーが可能になります。受信者が送信者より少しでも遅い場合、そうでなければ次の開始ビットの開始を見逃します。レシーバは、新しいスタートビットごとにクロックをリセットして再起動し、タイミングエラーが累積しないようにします。

したがって、これらすべてから、最初のトレースが少なくとも2バイトを送信しているように見え、最後のトレースが5のように見えることがわかります。

トレースの時間スケールを拡大すると役立ちます。そうすれば、少し時間が実際に何であるかを測定できます。これにより、実際に9600ボー(104 µs /ビット)があることを確認し、キャプチャの個々のビットをデコードできます。現在のように、ビットがどこにあるかを確認するのに十分な解像度がないため、送信されているものを実際にデコードします。

追加:

あなたのシステムがバイナリではなくASCIIでデータを送信しているのではないかと思いました。小さなシステムでASCIIに変換すると、限られたリソースをより多く使用し、帯域幅の使用量が少なくなり、データをユーザーに表示したい場合はPCで簡単に変換できるため、これは一般的な方法ではありません。ただし、送信がASCII文字である場合、シーケンスが1バイトを超える理由、2番目の文字が長い理由(「255」は「0」よりも文字数が多い)、および両方が同じバイトで終わるように見える理由を説明します。最後のバイトは、おそらくある種の行末文字であり、通常はキャリッジリターンまたはラインフィードになります。

とにかく、時間スケールを拡張すると、送信されているものを正確にデコードできます。


1
ストップビット(およびスタートビットの反対側)は、新しい送信の開始時にエッジを強制します。
-stevenvh

@steven:はい、答えを読み直してそれを省き、編集に追加したことに気付きました。おそらく、あなたがコメントを書いているのと同じ頃でしょう。
オリンラスロップ

4
ASCIIの送信は「非効率的」ですが、それでも非常に良い選択です。私の組み込みシステムのほとんどはASCIIを送信するだけでなく、ASCIIコマンドも受信するため、端末プログラムから「会話」することで手動で実験することができます。SCPI規格(GPIBの一種の改良、他の電気的インターフェースに拡張)は、これらのラインに沿って機能する非常に正式な方法です。
クリスストラットン

4
行くに強く反対します。Asciiは、このようなわずかなコードを使用し、ベアメタルを小さな8ビターで実行します。もちろん、カスタムプログラムを作成することもできますが、それが失われた10年後はどうなりますか?そして確かに、彼の塩に値するプログラマーはバイナリターミナルをハックして何かをリバースエンジニアリングできます。しかし、人間が読めるインターフェースは、ほとんどの場合、メモリが大幅に制限され、パフォーマンスが重要なシステムでの小さなオーバーヘッドに見合うだけの価値があります。さらに、メモリがある場合は、デバッグ出力をオン/オフで埋め込むことができます。
クリスストラットン

2
顧客の要件であるため、ASCIIインターフェイスを使い始めたことに言及する必要があります... ファームウェアにコマンドとしてアイデアを追加して、施設内のどこででもテストできます。なし設定のクライアントに私は、誰かが複雑なことがあったのシステムが、1つのモジュールで持っていた問題に探しのための余分な物を用いた実験のファームウェアのバージョンを投稿するたびに更新プログラムを展開しました。クライアントとの電話で、私は彼らに端末を起動させ、未公開の工場テスト機能を使用してそれらを見てもらうことができました。
クリスストラットン

1

完全な詳細を知る必要があります:速度、開始ビットがある場合、データビットの数、停止ビットがある場合、パリティビットがある場合。これは、マイクロコントローラーのUARTがどのように構成されているかの関数でなければなりません。

Rigolスコープにシリアルデコードオプションがない場合(多くのDSOにはあります)、Xカーソルを使用してデコードを支援できます。データのリーディングエッジに最初のカーソルを置き、ビットストリーム内で2番目のカーソルを移動します。カーソル間のデルタを使用して、単純な算術演算によって現在ホバーしている「ビット」を判別できます。明らかに、開始/停止/パリティビットを無視します。


常に開始ビットと少なくとも1つの停止ビットがあります。余分なストップビットがある場合がありますが、これらはバイト間のデッドタイムと区別できません。古いメカニカルデコーダでは、メカニズムがリセットされるまでの時間を確保するために2つのストップビットが必要になる場合がありました。今日では、ほとんど常に8データビットがあり、パリティビットはありませんが、あなたが言うように、それは変化する可能性があります。
オリンラスロップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.