-2

我有一个问题,我必须将大量数据保存到一个 txt 文件中,问题是我每 100ns 从一个串口接收它们。我能怎么做?我试图将数据放在 RichTextBox 上,但收到线程错误。对不起我的英语不好。

我正在使用 Windows 7 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

如果数据总是以 100ns 的间隔出现,那么使用正常的操作系统,您将无法保持同步。100ns 间隔是 10MHz,因此您应该寻找可以处理该速度的实时操作系统。要实时显示它,您需要轻量级组件,因此实际上您应该对 RichTextBox 进行基准测试并检查它是否可以处理 10MHz。您可能遇到的另一个问题是中断延迟,如果需要 1us 才能获得它,那么您已经错过了 10 次数据传输。

于 2013-01-22T18:17:00.307 回答
1

您不太可能每 100 ns 获取一次数据:标准串行端口的最大速度为每秒 115,200 位,即最大每秒 11,520 字节。即使您的事件收到的每个字节都收到信号(也不太可能),那是每 87 微秒,而不是每 100 纳秒。

您收到线程错误的原因是因为在serialPort_DataReceived线程池线程上调用了该方法,并且只能从 UI 线程访问 UI 组件。让我们解决这个问题,然后担心您想要执行此操作的频率,以及在非 RTOS 中是否可能。

从您的代码来看,您使用的是 WinForms,而不是 WPF。试试这个:

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 回答