2016-06-12 44 views
1

我正在讓一個C#程序像一臺可憐的示波器一樣工作。我有一個發送到串行(Serial.write(analogRead(A0)))的Arduino,然後C#有一個線程,在主線程刷新圖表時讀取每個ms樣本。我的疑問是,我應該使用Serial.write還是Serial.print?在C#中使用線程實時顯示arduino analogRead()

是否有可能獲得2kS/s?我使用115200的波特率,這裏是代碼。

namespace TEST 
{ 
    public partial class Form1 : Form 
    { 

     static int buffer_size = 1024; 

     public static string comboBoxText; 
     public static int[] buffer = new int[buffer_size]; 
     IEnumerable<int> yData; 
     static int[] range = Enumerable.Range(0, buffer_size).ToArray(); 
     IEnumerable<int> xData = range; 
     public static bool flag = true; 


     public Form1() 
     { 


      Random rand = new Random(); 
      InitializeComponent(); 

      for (int c = 0; c<buffer_size;c++) { 
       buffer[c] = 0; 
      } 



      Thread thread1 = new Thread(fillBuffer); 
      thread1.Start(); 


      comboBox1.Items.Add("Select"); 
      foreach (string s in SerialPort.GetPortNames()) 
      { 
       comboBox1.Items.Add(s); 
      } 


     } 
     static public void fillBuffer() 
     { 
      Thread.Sleep(1000); 
      SerialPort serialPort1 = new SerialPort(); 
      serialPort1.PortName = "COM5"; 
      serialPort1.BaudRate = 115200; 
      serialPort1.Open(); 

      while (true) 
      { 


      } 

     } 


     private void timer1_Tick(object sender, EventArgs e) 
     { 
      yData = buffer; 
      chart1.Series[0].Points.DataBindY(yData); 

     } 

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 


      try { 

       comboBoxText = comboBox1.Text; 
      } 
      catch 
      { 
       MessageBox.Show("Porta Inválida"); 
       return; 
      } 
      comboBox1.Enabled = false; 

     } 

    } 

有沒有什麼我可以做的樣品每0.5ms,然後顯示樣本作爲點的集合?我沒有得到好的結果。如果有人能幫忙,謝謝!

+0

你試過串口事件嗎? –

回答

1

在115200的波特率和良好的處理器速度下,您的算法看起來足夠快。但是可以減慢速度的一件事是timer1的時間間隔。它應該設置爲儘可能最低。 Serial.Write和Serial.Print之間的區別也請查看this forum。同樣使用.net內置的串口事件處理程序可以爲您節省很多的壓力,同時也是一個更快,更高效的解決方案。你可能想看看它here

+0

我做到了,但我認爲它不能很好地工作......事件處理程序無法處理每秒2k個採樣。我應該使用緩衝區嗎? –

+0

@NikolasL。 1個樣本的數據包大小是多少?是1024嗎? – Ogbe

+0

不,實際上我正在使用圖片並逐個發送每個樣本。我使用定時器來控制採樣,並且一旦ADC轉換完成,我通過UART發送它。問題是我收到他們的時候。我使用hc-06發送,我猜它也一個接一個發送,但操作系統無法處理接收2.5k次/秒的事件,所以我認爲我應該通過讀取整個緩衝區來處理這個事件是2048字節,然後我對待。我對嗎 ? –

相關問題