большая задержка c# & arduino
- Войдите на сайт для отправки комментариев
Втр, 08/04/2014 - 14:46
есть прога на c# которая при нажатии на кнопку отправляет данные на ардуино
private void button4_Click(object sender, EventArgs e)
{ Byte[] data = { 1, 2, 3,4,5,6,7 }; serialPort1.Write(data, 0, data.Length); }
а вот прога которая принимает данные и отправлет обратно
int mas[7],i=0; void setup() { Serial.begin(9600); } void loop() { while (Serial.available()) { mas[i]=Serial.read(); i=i+1; } i=0; for (int k=0; k<=6; k++) { Serial.println(mas[k]); } delay(1000); Serial.println(); }
а вот код, который принимает данные обратно
private delegate void MyDelegate(string value); private void UpdateText(string value) { listBox1.Items.Add(value); listBox1.SelectedIndex = listBox1.Items.Count - 1; } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (InvokeRequired) //проверяем, в каком мы потоке {//если во вроричном, то через Invoke, создавая делегат Invoke(new MyDelegate(UpdateText), serialPort1.ReadLine().ToString()); return; } UpdateText(serialPort1.ReadLine().ToString()); }
При запуске программы на c#, на listbox"е отображаются нули. После нажатия на кнопку, отображаются также нули. Данные начинают отображаться ЧЕРЕЗ СЕКУНД 20!!
Что не так? подскажите плз!
привет
1. в сишарпе байт называется byte (c маленькой буквы)
2. не заморачивайтесь с потоками пока в одном потоке не всё отладили
3. ...лучше сначала в консольном приложении
4. почитайте о SerialDataReceivedEventArgs. Наверняка полученные данные в нём уже есть и не нужно применять readLine.
5. хорошо ли работает ваш ардуиновский скетч при использовании "монитора порта" встроенного в ПО Ардуино ? (без с# программы)
6. скорость сом порта у вас небольшая. Дуина обрабатывает строки 8-13 скетча практически мгновенно. Получается, что задержка в 18 строке может влиять на скорость получения. Т.е. ваши семь байт она может получать семь секунд.
7. замените ваши данные 1,2,3... на 65,66,67...
и покажите результат
спс toc!) вместо serialPort1.ReadLine() написал serialPort1.ReadExisting() все работает без задержек. Только он выводит все что есть в буфере, получается все не упорядоченно.