Прошу прощения за возможный ОФФтоп, есть знатоки C#?
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Не могу победить компорт из винформ.
Если есть кто может подсказать, то может через личку если тут ОФФ.
Если есть кто может подсказать, то может через личку если тут ОФФ.
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Что именно интересует? с каким устройством будешь работать? Помочь легко, только информации немного побольше-бы
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
- Крафтер
- Мастер
- Сообщения: 211
- Зарегистрирован: 27 мар 2015, 22:25
- Репутация: 61
- Настоящее имя: Андрей
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Вот из моего проекта обработка ком-порта, это просто С++, но я пока не рефакторил. И тут границы пакетов проверяются. Видел где-то в нете готовый пример работы с ком портом в C#, ищи лучше.
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Делаю управление устройством через микроконтроллер, все банально, посылаю команду, жду когда мк освободится шлю следующую.selenur писал(а):Что именно интересует? с каким устройством будешь работать? Помочь легко, только информации немного побольше-бы
Затык на ожидании подтверждения готовности.
пишу в студии, есть готовый класс компорт, как я понял он по умолчанию исполняется в отдельном потоке, но когда я в цикле проверяю изменилась ли переменная в которую читает из порта, она не меняется.
приходится в цикле ожидания постоянно делать comport.readstring().
я так понимаю, что пока крутится while() ожидания, второй поток либо вообще не работает либо не может переменную изменить, хотя бред какойто, зачем тогда в отдельном потоке запускается.
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Да примеров то полно, да все не то, что надо.Крафтер писал(а):Вот из моего проекта обработка ком-порта, это просто С++, но я пока не рефакторил. И тут границы пакетов проверяются. Видел где-то в нете готовый пример работы с ком портом в C#, ищи лучше.
- Крафтер
- Мастер
- Сообщения: 211
- Зарегистрирован: 27 мар 2015, 22:25
- Репутация: 61
- Настоящее имя: Андрей
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Как можно найти баг, не видя код? МК ответ точно присылает?
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Как-то делал ЧПУ контроллер, с управлением по ком-порту, и вот пример реализации:Bmax77 писал(а):Да примеров то полно, да все не то, что надо.Крафтер писал(а):Вот из моего проекта обработка ком-порта, это просто С++, но я пока не рефакторил. И тут границы пакетов проверяются. Видел где-то в нете готовый пример работы с ком портом в C#, ищи лучше.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Если нужно то все исходники, доступны тут: https://github.com/selenur там можешь посмотреть полную реализацию работы с ком портом
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Я шлю с компа фиксированным блоком, потому как МК принимает через ДМА в буфер, а вот обратно шлю Error, Busy, Ready.selenur писал(а):У компоненты компорт есть событие DataReceived,
Проблем с пересылом нет, есть проблема, что обработчик DataReceived, не может прервать работу while(!rx == Ready).
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
А можете выложить свой код, что-бы понятнее было
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Код: Выделить всё
private string rxString;
private void plotBtn_Click(object sender, EventArgs e)
{
byte[] Buff = new byte[20];
int x = 0, y = 0, x1 = 0, y1 = 0, y_revert, _x, _y, flag = 0;
g.Clear(Color.White);
g = pictureBox1.CreateGraphics();
y_revert = pictureBox1.Height;
Sended.Text = "";
for (var m = 0; m < lines.Count; m++)
{
if (lines[m].StartsWith("PU") == true)
{
Buff[0] = 1;
pens = pen1;
flag = 1;
rxLabel.Text = rxString;
}
else if (lines[m].StartsWith("PD") == true)
{
Buff[0] = 2;
pens = pen2;
flag = 1;
rxLabel.Text = rxString;
}
else if (lines[m].StartsWith("PA") == true)
{
var splits = new[] { "PA", ",", ";" };
var tmp = lines[m];
var num = tmp.Split(splits, StringSplitOptions.RemoveEmptyEntries);
x1 = System.Convert.ToInt16(num[0]);
y1 = System.Convert.ToInt16(num[1]);
_x = System.Convert.ToUInt16(x1 * 2.666666);
_y = System.Convert.ToUInt16(y1 * 2.666666);
Buff[0] = 3;
Buff[1] = 0;
Buff[2] = (byte)_x;
Buff[3] = (byte)(_x >> 8);
Buff[4] = (byte)_y;
Buff[5] = (byte)(_y >> 8);
x1 /= 5;
y1 = y_revert - y1 / 5;
g.DrawLine(pens, x, y, x1, y1);
x = x1;
y = y1;
flag = 1;
rxLabel.Text = rxString;
}
if (flag == 1)
{
if (myPort.IsOpen)
{
myPort.Write(Buff, 0, 20);
rxString = "Busy";
//System.Threading.Thread.Sleep(250);
while (rxString != "Ready")
{
rxString = myPort.ReadLine(); - пришлось сюда запихнуть и принудительно дергать чтение из порта.
rxLabel.Text = "Busy";
}
rxLabel.Text = rxString;
}
else
{
MessageBox.Show("COM port ERROR", "COM", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
flag = 0;
}
Sended.AppendText(lines[m] + "\r\n");
}
}
private void myPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// this.Invoke(new EventHandler(rxString_e));
}
private void rxString_e(object o, EventArgs e) ---------------------это все не работает если работает while
{
rxString = myPort.ReadLine();
rxLabel.Text = rxString;
}
- Крафтер
- Мастер
- Сообщения: 211
- Зарегистрирован: 27 мар 2015, 22:25
- Репутация: 61
- Настоящее имя: Андрей
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Ничёсе. Сколько код всего проекта весит? И где почитать описание программы, доступные возможности, а то может зря я свой пишу ?selenur писал(а):Если нужно то все исходники, доступны тут: https://github.com/selenur там можешь посмотреть полную реализацию работы с ком портом
- Крафтер
- Мастер
- Сообщения: 211
- Зарегистрирован: 27 мар 2015, 22:25
- Репутация: 61
- Настоящее имя: Андрей
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Если порт читает/пишет в асинхронном режиме, а тебе надо синхронно дождаться ответа, то надо вместо while запустить какой-то аналог WaitForSingleObject(okEvt) . При приходе данных порт вызывает обработчик, в нём прочитать строку и вызвать аналог SetEvent(okEvt); Или как-то настроить работу в синхронном режиме.
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Я не думаю что надо прям синхронно, но хотя бы как то, из простейшей задачи вылез такой головняк. Через тот костыль, что есть в программе оно конечно работает, но как мне кажется это не правильно.
Я понимаю, что не ловлю микросекунды в своей проге, но мне казалось, что раз обработчик события работает в другом потоке, то проблем с обработкой события быть не должно.Тут ждем, а там как только в порт что то пришло, сообщаем об этом через переменную сюда.))))
Я понимаю, что не ловлю микросекунды в своей проге, но мне казалось, что раз обработчик события работает в другом потоке, то проблем с обработкой события быть не должно.Тут ждем, а там как только в порт что то пришло, сообщаем об этом через переменную сюда.))))
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
При нажатии кнопки такой код будет приводить к зависанию всей программы, т.к. не всегда метод readline() у компорта тебе вернет строку "ready". Т.к. скорость работы компьютера и обращение к компорту происходит быстрее, чем контроллер успевает послать всю фразу, то получается примерно так: контроллер по символу бросает в компорт фразу ready, а на компьтере уже успевает вызваться медод readline пару раз, который из компьютерного буфера ком порта изъял "rea" а потом "dy" и поэтому у тебя цикл повиснет.
Вариантов решения много, первый плохой способ, это ставить паузу например на пару секунд, что-бы буфер компорта успел наполниться всей фразой.
Второй вариант как у меня, дополнительный поток собирает полученные данные, а в другом потоке уже анализируешь.
Так-же нужно учесть что нужные данные от контроллера можешь и недождаться! и программа не должна от этого зависнуть
Вариантов решения много, первый плохой способ, это ставить паузу например на пару секунд, что-бы буфер компорта успел наполниться всей фразой.
Второй вариант как у меня, дополнительный поток собирает полученные данные, а в другом потоке уже анализируешь.
Так-же нужно учесть что нужные данные от контроллера можешь и недождаться! и программа не должна от этого зависнуть
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Весит в принципе не много, более менее информация тут http://www.cnc-club.ru/forum/viewtopic.php?f=41&t=4215 это я делал для саморазвия в чпу, и там много ещё косяков, т.к. проект забросил...Крафтер писал(а):Ничёсе. Сколько код всего проекта весит? И где почитать описание программы, доступные возможности, а то может зря я свой пишу ?selenur писал(а):Если нужно то все исходники, доступны тут: https://github.com/selenur там можешь посмотреть полную реализацию работы с ком портом
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Вообще readline вернет тогда когда встретит в буфере "\n", но я допускаю, что могут быть косяки. Второй поток, вроде как работа с компортом по умолчанию в другом потоке идет, по этому например из обработчика нельзя напрямую на форме менять значения например текстовых полей, возможно лиш изменить значение переменной, но почему то у меня это не работает.selenur писал(а):При нажатии кнопки такой код будет приводить к зависанию всей программы, т.к. не всегда метод readline() у компорта тебе вернет строку "ready". Т.к. скорость работы компьютера и обращение к компорту происходит быстрее, чем контроллер успевает послать всю фразу, то получается примерно так: контроллер по символу бросает в компорт фразу ready, а на компьтере уже успевает вызваться медод readline пару раз, который из компьютерного буфера ком порта изъял "rea" а потом "dy" и поэтому у тебя цикл повиснет.
Вариантов решения много, первый плохой способ, это ставить паузу например на пару секунд, что-бы буфер компорта успел наполниться всей фразой.
Второй вариант как у меня, дополнительный поток собирает полученные данные, а в другом потоке уже анализируешь.
Так-же нужно учесть что нужные данные от контроллера можешь и недождаться! и программа не должна от этого зависнуть
проверял даже таким образом, заставлял мк постоянно слать строку Ready, так вот пока whail крутится, переменная не меняется. Хз в чем косяк.
https://www.youtube.com/watch?v=MmvzElor0s8
- selenur
- Почётный участник
- Сообщения: 4604
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1621
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Можешь запустить отладку с остановкой в нутри цикла, и показать что у тебя в переменной??
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Имеешь в виду так как сейчас работает или когда через event?
-
- Мастер
- Сообщения: 400
- Зарегистрирован: 13 авг 2013, 11:05
- Репутация: 39
- Контактная информация:
Re: Прошу прощения за возможный ОФФтоп, есть знатоки C#?
Вот так переписал обработчик с эвентом, отлично работает пока на форме ничего не нажимаешь (сделал циклическую посылку статуса с мк).
Вот так выглядит посылка команды и ожидание:
Вычитал, что для того чтобы из другого потока изменить что то на форме во время работы основного потока, нужно их вручную синхронизировать.
Короче костыль на костыле, чувствую для таких задач надо поискать какой то другой способ разработки.
Код: Выделить всё
private void myPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string status = myPort.ReadLine();
this.BeginInvoke(new LineReceivedEvent(LineReceived), status);
// this.Invoke(new EventHandler(rxString_e));
}
private delegate void LineReceivedEvent(string status);
private void LineReceived(string status)
{
//rxString = myPort.ReadLine();
rxLabel.Text = rxString = status;
}
private void clearBtn_Click(object sender, EventArgs e)
{
lines.Clear();
g.Clear(Color.White);
Sended.Text = null;
plotBtn.Enabled = false;
}
}
Код: Выделить всё
if (myPort.IsOpen)
{
if (myPort.IsOpen)
{
myPort.Write(Buff, 0, 20);
rxString = "Busy";
//System.Threading.Thread.Sleep(250);
while (rxString != "Ready")
{
//rxString = myPort.ReadLine();
rxLabel.Text = "Busy"; --------------- и вот тут код крутится бесконечно потому что значение переменной не меняется.
}
//rxLabel.Text = rxString;
}
//rxLabel.Text = "Ready";
}
else
{
MessageBox.Show("COM port ERROR", "COM", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Короче костыль на костыле, чувствую для таких задач надо поискать какой то другой способ разработки.