繁体   English   中英

C#串行数据接收非常慢

[英]c# Serial DataReceived very slow

我试图与C#中的Arduino Due通信。 通讯效果很好,但是我的DataReceived处理程序需要大约1秒钟来做出反应。 这是我的问题,因为我必须发送多达10亿(1 * 10E9)条命令。

如果我在Arduino中激活DEBUG设置,它会告诉我命令需要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#需要这么长时间才能调用数据处理程序?

真诚的问候,Fabian Harmsen

更新
-添加了对DataHandler的注释(24.02.2016 16:30 Europa /柏林)

问题出在serialPort1_DataReceived接收到的数据处理程序中。

我用while(true)循环和serial.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)
    { }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM