Arduino IDEとVisual Studioの間の速度の大幅な低下

だから、私はこれを引き起こしているか分からないが、多分単純なものを見落としているかもしれない。私は、640 Hzでアナログ入力を読み取るように設計されたシンプルなプログラムを持っています。

int Ch0 = 0;
int count = 0;
unsigned long startTime;
unsigned long currentTime;
bool startedReading = false;


void setup() {
  //set up pin(s)
   pinMode(Ch0, INPUT);

  //begin serial at 115200bps
  Serial.begin(115200);
}

...

//if the current time exceeds the start time by one second, set the start time equal to current time, print the count, set count equal to zero
if (currentTime - startTime >= 1000) {
  startTime = currentTime;
  Serial.println("time");
  count = 0;
}



//read input, delay some microseconds as a means of controlling sampling rate, bring count up by one
//should read somewhere along the lines of 640-ish Hz
analogRead(Ch0);
delayMicroseconds(1230);
Serial.println(count);
count++;

そして、これはすべてArduino IDEでうまく動作し、シリアルモニタをプルアップし、すべての番号が1〜640の数字で表示され、その後、良い一貫性で時間が表示されます。それでも、Visual Studioプログラムを開いて、次のコマンドを呼び出すと、

編集:全体のデータ受信イベントメソッドを追加

private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
    if (!this->reading) return;
    else 
    {
         try
         {
            //get incoming port and read
            SerialPort^ sp = (SerialPort^)sender;
            String^ sInData = sp->ReadLine();
            //parse read data
            double inData = double::Parse(sInData);

            //write data to debugger for testing
            Debug::WriteLine(inData);


            //start populating the "in" array
            AppendIn(inData);
          }
          catch (Exception^ e)
          {
            Debug::WriteLine(e->Message);
          }
    }
}

文字列「時間」を解析して1秒が経過したことを示すときに発生する明白なエラーを除いて、すべて正常に動作します。数字がデバッガに非常にゆっくりと供給されるという事実を除いては、でのように、それは約4〜5秒のカウント整数のすべての640読み込みを読み取るためにかかるし、それは私に時間をスローします。したがって、これはArduinoが実際に1秒が経過してからそれを送信することを計算していると結論づけますが、出力は本質的に同じです。唯一の違いは、メッセージがArduino IDEで読み込むのに正確に1秒かかりますVisual Studioでリアルタイムで4秒間読み取ります。

たぶんそれは私がVSのデータを読んでいる方法と関係がありますか?シリアル経由でデータが受信されたときに、そのメソッドをイベントとして毎回呼び出すことによって、ストリームを常に監視するように設定しました。データが全く失われていない、それはちょうど非常に遅いです...そしてVSでのみ。あなたが与えることができる任意のヘルプの事前に感謝が、私は少しの損失になっています。

0

1 答え

シリアル経由でデータが受信されたときに、そのメソッドをイベントとして毎回呼び出すことによって、ストリームを常に監視するように設定しました。

私はそれが問題だと思う。入ってくる "シリアルデータ利用可能"イベントを待ってから処理すると、処理が遅くなる可能性があります。シリアルデータをどのように取得するか再検討します。あなたはそのビットを表示していませんが、もっと大きなバッファを使うことができます。

0
追加された
この場合、どのようにWindowsの機能が動作するのか正確にはわかりません。あなたは参照を提供できますか? (リンク)。私が思っているのは、イベントが最初の着信バイトで呼び出され、ReadLineがライン全体を待っている(そして数秒後にタイムアウトする)ことです。
追加された 著者 Nick Gammon,
うーん、「シリアルデータをどうやって取得するのか」ということを完全には理解できていませんが、それが意味するものなら、残りのイベントも含めました。このメソッドは、C ++ WindowsフォームのシリアルポートコントロールのOnDataReceivedイベントに追加されています。つまり、私はあなたの提案を受け取り、読み取りバッファサイズを16384(これまでの4倍)にクランプしましたが、目立った速度改善はありませんでした。だから、イベントを1秒間に640回発射することと関連があるかもしれません。しかし、私は他の方法でそれを続けて読むことができなければならないでしょう。
追加された 著者 Dɑvïd,
私はあなたが正しいかもしれないと思う、このページによると、それは新しい行の文字まで読んでいます。その間に、私はこのページで参照されているいくつかのプロパティを使いこなそうとします。 msdn.microsoft .com/en-us/library /…
追加された 著者 Dɑvïd,
私が5分間だけコメントを編集できるので、私は二重コメントをしなければならないように見えるが、タイムアウトを無効にしてから、ReadLine()コマンドを他の代替読み込みに変更しようとした。 5程度かそこらでテストするのは難しくありませんでした)、今は完全に動作しているようです。私はReadExisting()の最高のスピードを得ているようだが、精度はそれほど高くない。それはちょうど正確に640 Hzで読んでいるかどうかを知ることは少し難しいですが、そうでなければ非常に近いです。助けてくれてありがとう!
追加された 著者 Dɑvïd,