Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Синхронизация при приеме данных с ком порта. / 12 сообщений из 12, страница 1 из 1
24.02.2015, 11:07
    #38886886
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
Ситуация такая. Посылаю данные в контроллер по ком порту. Контроллер парсит данные и возвращает мне пакет обратно.
Ивент при получении данных от контроллера. Это отдельный поток у объекта SerialPort.
Код: c#
1.
2.
3.
4.
5.
System.IO.Ports.SerialDataReceivedEventArgs e)
{
       count = Globals.SerPort.ReadBytes(ref packet);
       paket_good = true;
}


А тут посылка - прием.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
private void buttonGet_Click(object sender, EventArgs e)
        {
            if (Globals.SerPort.comport == null || !Globals.SerPort.comport.IsOpen)
            {
                MessageBox.Show("Serial port is closed.");
                return;
            }

            buttonGet.Enabled = false;
            rec_del = 0;

            try
            {
                //send packet
                Globals.SerPort.comport.Write(packet, 0, packet.Length);

                //receive packet
                while (!paket_good)
                {
                    Thread.Sleep(100);
                    rec_del++;
                    if (rec_del > 50)
                        break;
                }

                if (count > 0)
                {
                    textBoxDirection.Text = packet[17].ToString();
                    textBoxDisplayRefresh.Text = packet[18].ToString();
                    textBoxBackflowThreshold.Text = (packet[20] + (packet[19] << 8)).ToString();
                }
                else
                {
                    textBoxDirection.Text = "";
                    textBoxDisplayRefresh.Text = "";
                    textBoxBackflowThreshold.Text = "";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                buttonGet.Enabled = true;
            }
        }


Если я ставлю точку останова на while (!paket_good) или на if (count > 0) все хорошо я вижу принятый пакет с корректными данными. Но если я запускаю приложение без точки останова тексбоксы остаются пустыми. Не могу понять где происходит рассинхронизация между потоками.
...
Рейтинг: 0 / 0
24.02.2015, 11:19
    #38886903
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
небольшая ошибка - ивент выглядит так
Код: c#
1.
2.
3.
4.
5.
private void comport_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
 {
       count = Globals.SerPort.ReadBytes(ref packet);
       paket_good = true;
 }
...
Рейтинг: 0 / 0
24.02.2015, 11:30
    #38886933
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
jenya7небольшая ошибка - ивент выглядит так


Тут и читай, нафига твой поток висит в баттон_клике??!
...
Рейтинг: 0 / 0
24.02.2015, 11:35
    #38886937
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
Pallarisjenya7небольшая ошибка - ивент выглядит так


Тут и читай, нафига твой поток висит в баттон_клике??!
так надо же выдать данные на визуальные контролы. я не могу апдейтировать контролы в другом потоке.
...
Рейтинг: 0 / 0
24.02.2015, 11:38
    #38886941
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
jenya7так надо же выдать данные на визуальные контролы. я не могу апдейтировать контролы в другом потоке.

Можешь
Код: c#
1.
2.
3.
4.
if (control.InvokeRequired)
{
    control.Invoke(....)
}



Таймаут сделай таймером - начал отправку, запустил таймер. Если получил все, что нужно - отменил таймер. Если нет - в событии таймера делаешь свою обработку таймаута
...
Рейтинг: 0 / 0
24.02.2015, 11:51
    #38886962
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
Pallarisjenya7так надо же выдать данные на визуальные контролы. я не могу апдейтировать контролы в другом потоке.

Можешь
Код: c#
1.
2.
3.
4.
if (control.InvokeRequired)
{
    control.Invoke(....)
}



Таймаут сделай таймером - начал отправку, запустил таймер. Если получил все, что нужно - отменил таймер. Если нет - в событии таймера делаешь свою обработку таймаута
да. самый оптимальный вариант.спасибо.
...
Рейтинг: 0 / 0
24.02.2015, 11:53
    #38886966
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
jenya7,

Вот, седьмой пункт, моя гордость... :-)

923566

Как раз научился, когда с ком-порта данные обрабатывал...
:-)
...
Рейтинг: 0 / 0
24.02.2015, 12:00
    #38886983
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
D129jenya7,

Вот, седьмой пункт, моя гордость... :-)

923566

Как раз научился, когда с ком-порта данные обрабатывал...
:-)
я как раз это и читаю. :)
...
Рейтинг: 0 / 0
24.02.2015, 12:21
    #38887027
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
D129Вот, седьмой пункт, моя гордость... :-)


Таки уже можно не объявлять делегаты

Код: c#
1.
2.
3.
4.
5.
6.
7.
public void SetStatus(string val)
        {
            if (labelStatus.InvokeRequired)
                labelStatus.Invoke(new Action<string>(SetStatus),new object[] {val});
            else
                labelStatus.Text = val;
        }
...
Рейтинг: 0 / 0
24.02.2015, 12:29
    #38887044
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
PallarisТаки уже можно не объявлять делегаты


Отправьте модератору. Пусть добавит.
:-)
...
Рейтинг: 0 / 0
24.02.2015, 12:32
    #38887048
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
PallarisD129Вот, седьмой пункт, моя гордость... :-)


Таки уже можно не объявлять делегаты

Код: c#
1.
2.
3.
4.
5.
6.
7.
public void SetStatus(string val)
        {
            if (labelStatus.InvokeRequired)
                labelStatus.Invoke(new Action<string>(SetStatus),new object[] {val});
            else
                labelStatus.Text = val;
        }


а что разве Action не завуалированный делегат?
...
Рейтинг: 0 / 0
24.02.2015, 12:34
    #38887053
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Синхронизация при приеме данных с ком порта.
jenya7а что разве Action не завуалированный делегат?

Его сделали именно для того, чтобы не нужно было плодить кучи разных делегатов в своей программе, а пользоваться теплыми, ламповыми Action
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Синхронизация при приеме данных с ком порта. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]