2016-02-24 4 views
0

Я пытаюсь связаться с Arduino Due на C#. Коммуникация работает спокойно, но моему обработчику DataReceived требуется около 1 секунды, чтобы реагировать. Это моя проблема, потому что мне нужно отправить до 1 миллиарда (1 * 10E9) команд.C# Последовательный DataReceived очень медленно

Если я активирую DEBUG Setting в Arduino, он говорит мне, что для команды требуется 64 миллисекунды. Я думаю, что приложение C# должно получить его не позднее 80 миллисекунд после отправки.

Вот часть Кодекса

StopWatch s1 = new StopWatch(); 
private void Open_Port() 
{ 
    string port = null; 
    int baud = 0; 
    bool ERR = false; 
    if ((COM_cb.SelectedItem != null) | (BAUD_cb.SelectedItem != null)) 
    { 
     port = this.COM_cb.GetItemText(this.COM_cb.SelectedItem); 
     baud = Convert.ToInt32(this.BAUD_cb.GetItemText(this.BAUD_cb.SelectedItem)); 
     ERR = false; 
    } 
    else 
    { 
     ERR = true; 
     System.Windows.Forms.MessageBox.Show("Error Msg"); 
    } 

    if (ERR == false) 
    { 
     serialPort1.PortName = port; 
     serialPort1.BaudRate = baud; 
     serialPort1.Open(); 
    } 
    if (serialPort1.IsOpen)//Kalibrieren der Buttons 
    { 
     OPEN_btn.Enabled = false; 
     CLOSE_btn.Enabled = true; 
     textBox1.ReadOnly = false; 
     ERR = true; 

    } 
} 


private void Print_Click(object sender, EventArgs e) // start 
{ 
    Thread t = new Thread(transmit_pic); 
    t.Start(); 
} 

private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    s1.Stop(); 
    //Till this line it take 1 Second after sending 
    //string t = ""; 
    int byt = serialPort1.BytesToRead; 
    byte[] buffer = new byte[1]; 

    for (int i = 0; i < byt; i++) 
    { 
     serialPort1.Read(buffer, 0, 1); 
     if(buffer[0] == '0') { 
      got_answer = true; 
     } 
     //t += (char)buffer[0]; 
    } 
    //RxString= t; 
    //this.Invoke(new EventHandler(DisplayText)); 
} 

private void sendAktion(int[,] data) 
{ 
    string s = int_to_string(data, false); 
    Console.Write("Send->"); 
    serialPort1.Write(s); 
    s1.Start(); 
    got_answer = false; 
    int i = 0; 
    while (!got_answer) { i++; } //wait for answer 

    i = 0; 
    Console.WriteLine("back again "); 
} 
private void transmit_pic() 
{ 
    stop = false; 
    Bitmap bm = new Bitmap(img); 
    if (!serialPort1.IsOpen) 
    { 
     MessageBox.Show("Open the Serial Port first!"); 
    } 
    else 
    { 
     int size_X = bm.Width; 
     int size_Y = bm.Height; 


     for (int h = 0; h < size_Y; h++) 
     { 
      for (int w = 0; w < size_X; w++) 
      { 
       if(/*somthing happend*/){ 
        //get data... 
        sendAktion(data) 


       } 
      } 
     } 
     Console.WriteLine("DONE"); 
    } 
} 

Есть кто-нибудь навязчивая, почему C# нужно так долго, чтобы вызвать DataHandler?

Искреннее С уважением, Фабиан Harmsen

UPDATE
- Добавлен комментарий к DataHandler (24.02.2016 16:30 Европа/Берлин)

+0

Какой у вас размер упаковки от adruino? Сколько байтов отправлено в 64 мс? – Ian

+0

@ Я могу отправить около 20 символов и назад только 1 символ, –

+0

ОК, тогда у него не должно быть проблем. Вероятно, ваш 'Invoke' делает это медленным, как предлагает HansPassant. Рассмотрите возможность ввода ваших данных в 'Queue' каждый раз, когда он будет получен и обрабатывается только для отображения текста один раз в секунду (скажем, раз в 5 секунд). Тогда ваша программа должна работать намного быстрее. – Ian

ответ

1

Проблема заключается в serialPort1_DataReceived получил обработчик данных.

Я провел отдельную нить с токовым (истинным) циклом и последовательным.ReadLine(), все работает отлично.

Надеюсь, что кому-то еще не нужно тратить 3 часа на это.

using System.Threading; 

public void main() 
{ 
    setup(); 
    Thread readThread = new Thread(Read); 
    readThread.Start(); 
} 

public void Read() 
{ 
    while(true) 
    { 
    try 
    { 
     string message = serialPort1.ReadLine(); 
    } 
    catch (Exception) 
    { } 
} 
Смежные вопросы