Я пытаюсь связаться с 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 Европа/Берлин)
Какой у вас размер упаковки от adruino? Сколько байтов отправлено в 64 мс? – Ian
@ Я могу отправить около 20 символов и назад только 1 символ, –
ОК, тогда у него не должно быть проблем. Вероятно, ваш 'Invoke' делает это медленным, как предлагает HansPassant. Рассмотрите возможность ввода ваших данных в 'Queue' каждый раз, когда он будет получен и обрабатывается только для отображения текста один раз в секунду (скажем, раз в 5 секунд). Тогда ваша программа должна работать намного быстрее. – Ian