-2

問題があります。大量のデータをtxtファイルに保存する必要があります。問題は、シリアルポートから100nsごとにデータを受信することです。どのようにできるのか?RichTextBox にデータを配置しようとしましたが、スレッド エラーが発生します。私の英語でごめんなさい。

Windows7 64ビットを使用しています

    private: void FindPorts(void)
    {
        array<Object^>^ ListaPorte = SerialPort::GetPortNames();
        this->cmbPort->Items->AddRange(ListaPorte);
    }

private: System::Void btnOpenPort_Click(System::Object^  sender, System::EventArgs^  e)
         {
             if(this->cmbPort->Text==String::Empty || this->cmbBaudRate->Text==String::Empty)
                 this->rtbLog->Text="cmbError";
             else
             {
                 try{
                     if(!this->serialPort->IsOpen)
                     {
                         this->serialPort->PortName = this->cmbPort->Text;
                         this->serialPort->BaudRate = Int32::Parse(this->cmbBaudRate->Text);
                         this->serialPort->Open();
                         this->rtbLog->Text+="Porta aperta\r\n";
                         this->btnOpenPort->Text="Close Port";
                     }
                     else
                     {
                          this->serialPort->Close();
                          this->rtbLog->Text+="Porta chiusa\r\n";
                          this->btnOpenPort->Text="Open Port";
                     }
                 }
                 catch(UnauthorizedAccessException^)
                 {
                    this->rtbLog->Text+="UnauthorizedAccessException\r\n";
                 }
             }
         }

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    {
        if(!lettura)
        {
            lettura = true;
            this->button1->Text="sto leggendo";
        }
        else
        if(lettura)
        {
            lettura=false;
            //rtbLog->Text += letturaBuffer;
            this->button1->Text="sono ferma";
        }
        //serialPort->
    }

    private: System::Void serialPort_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) 
    {
        if(lettura){
            //letturaBuffer += serialPort->ReadExisting() + "\r\n";
            rtbLog->Text += serialPort->ReadExisting() + "\r\n";
        }


    }
4

2 に答える 2

2

通常のOSでは、データが常に100ns間隔で来るとペースを維持できません。100ns 間隔は 10MHz なので、その速度に対応できるリアルタイム OS を探す必要があります。リアルタイムで表示するには軽量な部品が必要なので、実際にそのRichTextBoxをベンチマークして10MHzに対応できるか確認する必要があります。発生する可能性のある別の問題は、割り込みレイテンシです。それを取得するのに 1us かかる場合、すでに 10 回のデータ転送を逃しています。

于 2013-01-22T18:17:00.307 に答える
1

100 ns ごとにデータを取得することはまずありません。標準シリアル ポートの最大速度は 115,200 ビット/秒で、これは最大で 11,520 バイト/秒です。受信したバイトごとにイベントが通知されたとしても (これもありそうもないことですが)、それは 100 ナノ秒ごとではなく、87 マイクロ秒ごとです。

スレッド エラーが発生する理由は、serialPort_DataReceivedメソッドがスレッドプール スレッドで呼び出されており、UI コンポーネントには UI スレッドからしかアクセスできないためです。それを修正してから、これをどのくらいの頻度で実行したいか、および非 RTOS で可能かどうかを心配してください。

コードからは、WPF ではなく WinForms を使用しているように見えます。これを試してください:

void AddAString(String^ s)
{
    this->rtbLog->Text += (s + Environment::NewLine);
}

void serialPort_DataReceived(Object^ sender, SerialDataReceivedEventArgs^ e) 
{
    if(lettura)
    {
        this->BeginInvoke(
            gcnew Action<String^>(this, MyClass::AddAString),
            serialPort->ReadExisting());
    }
}
于 2013-01-22T19:02:23.833 に答える