1

最近、スマート メーターから出力されたデータを読み取るために Arduino UNO を購入しました。メーターはシリアル通信を使用しており、ラップトップの画面に出力される値を確認したいと考えています。SoftwareSerial ライブラリを使用して着信データを読み取り、そのデータをハードウェア シリアルと Arduino IDE のシリアル モニターを使用して画面に出力する必要があると考えました。Arduino での (ソフトウェア) シリアル通信に慣れるために、SoftwareSerial ライブラリのドキュメントを確認しました。問題は、最も基本的な例を機能させることができず、かなり長い間これに固執していることです。サンプル コードは以下のとおりです。例はここにあります。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

私が理解している限りでは、次のことが起こるはずです: - シリアル モニタ ウィンドウにテキストを入力します。-Serial.read()このデータを読み取り、ソフトウェア シリアルに書き込みます。- ソフトウェア シリアルはこのデータを読み取り、シリアルに書き戻します。- 書いたものが画面に表示されます。

しかし、私が何をしようとしても、何も起こりません。私が従おうとしたものの中で: - ソフトウェアとハ​​ードウェアの両方のシリアルのボーレートを変更します (たとえば 9600)。- 別の SoftwareSerial ライブラリ (AltSoftSerial) を試しました。- SoftwareSerial の異なる RX および TX ピンを試しました。- の代わりにSerial.write(mySerial.read());char最初に結果を格納します。

私はおそらく明らかな何かを見逃しています。これに光を当てることができる人、またはスマートメーターからデータを読み取る別の方法を提供できる人に感謝します.

編集

例では「この例には回路がありません」と指定されていたため、配線はありませんでした。@slash-dev によって提案された 3 つのオプションをすべて試しましたが、期待どおりの動作をするものはありませんでした。

SoftwareSerialピン 1 をピン 10 に、ピン 0 をピン 11 に接続するワイヤを使用します。奇妙な文字が出力されます。

Goodnight moon!
Ùniÿhtÿmoÿn!ÿ
nihtmoÿttt

AltSoftSerial1-8 と 0-9 を接続するワイヤー付き。最初に印刷Goodnight moon!し、次に印刷を続けますÔ당¥�¡Ñ�moon!

NeoSWSerial1-10 と 0-11 を接続するワイヤー付き。と同じですAltSoftSerialが、印刷を続けますÔë‹–+ë¡Ñ�j½½¹…j

4

1 に答える 1

1

ボーレートは と で同じでなければなりませSerialmySerial

接続について説明していないので、質問する必要があります。ピン 1 (Serial送信) からピン 10 (mySerial受信) にワイヤを接続し、ピン 0 (Serial受信) からピン 11 (mySerial送信) に別のワイヤを接続しましたか? それらがどのように交差しているかに注意してください。

AltSoftSerialが実際には最良の選択ですが、ピン 8 (RX) とピン 9 (TX) でのみ機能するため、8 を 1 に、9 を 0 に接続する必要があります。SoftwareSerial は長時間割り込みを無効にするため、非常に非効率的です。これは、スケッチの他の部分や他のライブラリに干渉する可能性があります。

私のNeoSWSerialライブラリは別の代替手段です。とほぼ同じ効率AltSoftSerialですが、任意の 2 つのピンで機能します。(SoftwareSerial とは異なり) 同時に送受信できますが、ボー 9600、19200、および 38400 でのみ機能します。

編集:

あなたが試したことはおそらくうまくいっていると思います。すべてのソフトウェア シリアル ライブラリは、文字ごとに 1 つの割り込みではなく、個々のビットを処理するために割り込みを使用します。システムに他の割り込みがある場合 (millis() TIMER0 またはSerial)、ビット「計算」が影響を受ける可能性があります。これは、間違ったバイトを受信して​​いることを示しています。ループバック テストでは、送信と受信が同期されているため、特に影響を受けやすくなっています (最初の受信割り込みは、送信割り込みが次の文字を開始している間に発生します)。

UART は送受信を同時に行うことができ、ビットではなく完全な文字を処理するため、0 から 1 をフックするだけでうまくいくと思います。文字割り込みは、ビットの送受信を妨げません。

NeoSWSerial ライブラリの開発において、私はこのマニフェストを同じように見てきました。完全に非同期でテストするには、2 つの Arduino を使用する必要がありました(つまり、同期していません)。あなたの場合、SmartMeter に AltSoftSerial を使用すると問題なく動作し、さまざまなボーレートを選択できます。SmartMeter 文字を にエコーする場合Serialは、 のボー レートが高いことを確認してくださいSerial

于 2016-11-11T00:22:49.063 に答える