簡體   English   中英

實時讀取串口

[英]Read a serialport in real time

我正在嘗試執行控制,以接收Arduino發送的信息。

此信息的類型為字符串,格式為VX 1.987或VY 0.123,並以高速發送。 在對它們進行過濾和處理之后,它們將更新程序中的文本框,這樣,我在文本框中看到的就是收到的最后一條信息。

我的代碼發生的事情是,例如,在某個時刻,Arduino發送了1000行,我的程序將更新到600行,然后停止顯示更新。 我知道在接收緩沖區中還有其他400行,但未顯示。 總結如何使備忘錄時間通過串行接收信息並讀入文本框? 這可能是處理時間問題嗎? 怎么解決?

namespace ControleCaseiro
{
    private void Form1_Load(object sender, EventArgs e)
    {
         serialPort1.DataReceived += new    SerialDataReceivedEventHandler(serialPort1_DataReceived);
    } 

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {                   
                    DataIn = serialPort1.ReadLine();
                    this.Invoke(new EventHandler(MostraDados));                
            }
            catch(Exception ex)
            { }
        }

     private void MostraDados(object sender, EventArgs e)
      {
        switch (DataIn)
            {
                case "19\r":
                    textcontrole.Text = "XOFF";
                    break;
                case "17\r":
                     textcontrole.Text = "XON";
                    if (botãoEnviaGcode)
                    {
                        LinhaArquivo++;
                        EnviaGcode();
                    }
                    break;
                default:
                    FiltroDadosRecebidos(DataIn);                 
                    break;
            }      
      }

    private void FiltroDadosRecebidos(string valorRecebido)
     {        
        string eixo="";
        int tamanho=0;
        string valorEixoAtual="";
        if (valorRecebido.Length > 1)
            {               
                    tamanho = valorRecebido.Length;           
                     eixo = valorRecebido.Substring(0, 2);                   
            switch (eixo)
               {                             
                  case "VX":
                              valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);           
                              txtPosAtualX.Text=valorEixoAtual;
                              break;
                  case "VY":
                              valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);
                              txtPosAtualY.Text=valorEixoAtual;
                              break;
                  case "VZ":
                              valorEixoAtual = valorRecebido.Substring(2, tamanho - 3);
                              txtPosAtualZ.Text=valorEixoAtual;
                              break;
                   default :
                              DadosRecebidos.Items.Add(DataIn);// se não for dados referentes aos eixos, vai mostrar na listbox “DadosRecebidos”
                              break;
               }

            }                     

        }
    }

正如我在開始時已經描述的那樣,Arduino正在發送信息是什么,過一會兒,所有信息發送到該信息,而信息未顯示在TextBox中。 看起來是在OA SerialPort接收數據時,事件“ SerialDataReceivedEventArgs”使程序顯示該信息,當接收到該信息時,不再顯示該信息,並且該信息會累積在串行端口緩沖區中。

問題可能是您沒有處理接收緩沖區中的所有數據。 即使可能有多行等待處理,您也只提取了一行接收緩沖區。 您可以嘗試將處理程序更改為以下形式:

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            while (serialPort1.BytesToRead > 0)
            {
                DataIn = serialPort1.ReadLine();
                this.Invoke(new EventHandler(MostraDados));
            }
        }
        catch (Exception ex)
        { }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM