ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

arduinoコミュの質問:NewSoftSerial

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Arduino UNOを使って、シリアル通信の内容をモニタしたいと思い、次のようなスケッチを作成したのですが、シリアル通信の内容を読みとることができません。

意図している動作は、7番、9番ピンに9600BAUDのシリアル信号を入力し、その内容をUNOのUSBシリアルでPCに送信させようというものです。

7,9番ピンに来ている信号が正常なことは、UNOの0番ピン(RX)にそれぞれのリードの信号を入れて、ハードウェアシリアルでは読み取れることを確認しています。

どこに問題がありそうでしょうか?

-------------------------------
#include <NewSoftSerial.h>

NewSoftSerial RxMonitor(7, 8);
NewSoftSerial TxMonitor(9, 10);

int rts;
int dtr;
char Status[] = {'R','0','D','0',';','\n', '\0'};

void setup() {
Serial.begin(57600);
pinMode(7, INPUT);
pinMode(9, INPUT);
RxMonitor.begin(9600);
TxMonitor.begin(9600);

pinMode(2, INPUT);
pinMode(4, INPUT);

rts = digitalRead(2);
dtr = digitalRead(4);
SetStatus(rts,dtr);
Serial.print(Status);

}

void loop() {
int rts_now = digitalRead(2);
int dtr_now = digitalRead(4);
int rx;
int tx;

if((rts != rts_now) || (dtr != dtr_now)){
SetStatus(rts_now,dtr_now);
Serial.print(Status);
}

rts = rts_now;
dtr = dtr_now;

rx = RxMonitor.available();
tx = TxMonitor.available();

if(rx != 0){
Serial.print("[RX]");
while(rx > 0){
Serial.print((char)RxMonitor.read());
rx--;
}
}

if(tx != 0){
Serial.print("[TX]");
while(tx > 0){
Serial.print((char)TxMonitor.read());
tx--;
}
}

}

void SetStatus(int r, int d){
if(r == 0){
Status[1] = '0';
}else{
Status[1] = '1';
}

if(d == 0){
Status[3] = '0';
}else{
Status[3] = '1';
}
}

コメント(2)

ライブラリの中身までは追いかけていないので、確証はありませんが...。
SoftSerialって、2つ同時に使えましたっけ?
試しに1つだけにしてみては?
Y.Mitaさん>

アドバイスありがとうございます。

いま開発元のサイトのドキュメントを確認したところ、「複数のオブジェクトを作成することはできるが、アクティブにできるオブジェクトは1つのみ。よって次のようなプログラムは実現できない」

if (device1.available() > 0)
{
int c = device1.read();
...
}
if (device2.available() > 0)
{
int c = device2.read();
...
}

と書かれてました。その制限に引っかかってますね。

試しに1つの信号のみを読むように書き換えてみたらシリアルデータを読み取れました。

実現したい仕様を完全に満たすには現状ではArduino Megaを使うしかないようです。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。