Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/20: Рейтинг темы: голосов - 20, средняя оценка - 4.95
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
1

График

21.06.2011, 10:51. Показов 4005. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день ув. форумчане , собственно есть график , есть ком порт который принимает данные и выводит на график. Мне пришел 1 байт к примеру "1" записываем его как temp , потом пришло "2" записываем как temp2 , после того как мне пришёл 2 байт , он должен считать по формуле
"Z = (256 х temp2) + temp1"
После этого выводить на график то что мы получили в Z.
Подскажите как реализовать , на данный момент реализовано только получение пакетов , и вывод пакетов на график.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2011, 10:51
Ответы с готовыми решениями:

Построить график функции y=x^2. График строится из отрезков и алгоритма Брезенхема
Построить график функции y=x^2. График строится с помощью отрезков. Для построения отрезков...

График
Добрый день ув. Форумчане , вот такой вопрос: Как мне построить график , который будет строится...

График
Помогите с задачей, я ввожу в один text.box координату Х а во второй text.box координату У. и нужно...

График
Есть список. При нажатии на кнопку строится график (ось ОХ-номер элемента, ОУ-значение элемента)

45
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 14:37  [ТС] 21
Author24 — интернет-сервис помощи студентам
Этот вариант не работает , я уже пробовал , там тоже самое Temp[0] и Temp[1] принимают одинаковые значения
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 14:46 22
После чтения размер буфера ком порта уменьшается? Входящие данные изменяются или постоянные? Возможно после считывания из буфера он не очищается. Через C# с комом просто не работал, но VISA ком очищает после считывания.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 14:53  [ТС] 23
Temp[0]и Temp[1] принимают значения 0 , и так постоянно , вот лог (маленький отрывок)
C#
1
148 148  0 0  0 0  0 0  0 0  0 0  0 0  76 76  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  87 87
а вот с помощью чего я это вывол
C#
1
Log2(LogMsgType.Incoming, Temp[0]  + " " + Temp[0] + "  ");
Добавлено через 2 минуты
а нет прошу прощения , это у меня ошибка была , в выводе лога , я там 2 раза Temp[0] вписал , но изменив на Temp[1] я всё равно получаю одни нули.
C#
1
70 0  0 0  0 0  0 0  0 0  0 0  0 0  42 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  61 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0  0 0
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 15:04 24
Можешь лог буфера в файл скинуть и выложить? Желательно каждое сообщение на новой строке.
Тогда будет видно что именно приходит. Пока сказать не могу в чем проблема.

Добавлено через 2 минуты
Хотя не нужно. На ком куча нулей приходит. Это что за устройство данные шлет?
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 15:05  [ТС] 25
Вот , сделал так чтобы вы разобрались , значит первые 2 числа это Temp[0] и Temp[1]
Вложения
Тип файла: txt test.txt (5.1 Кб, 10 просмотров)
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 15:10  [ТС] 26
да , но устройство не должен слать нули ... он их вообще ну не как не должен слать , с устройством всё норм ибо я проверяю его через wterm , и там пакеты норм приходят без нулей.
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 15:16 27
попробуй заменить
C#
1
tmp.AddRange(buffer);
на
C#
1
tmp.AddRange(buffer.ToList().GetRange(0,Z));
Потому что в MSDN нашел следующее:
Поскольку класс SerialPort предусматривает буферизацию данных, в отличие от потока, задаваемого свойством BaseStream, между ними возможен конфликт при определении числа байтов, доступных для чтения. Свойство BytesToRead может показывать, что байты для чтения имеются, однако они могут оказаться недоступными для потока, определенного свойством BaseStream, поскольку помещены в буфер для SerialPort.
1
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 15:28  [ТС] 28
C#
1
tmp.AddRange(buffer.ToList().GetRange(0,Z));
А вы уверены что должно стоять GetRange (0, Z) , у меня на Z орёт мол нету такой переменной , поставил вместо Z , 2 он орёт
"Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 15:46 29
Цитата Сообщение от gslim921 Посмотреть сообщение
C#
1
tmp.AddRange(buffer.ToList().GetRange(0,Z));
А вы уверены что должно стоять GetRange (0, Z) , у меня на Z орёт мол нету такой переменной , поставил вместо Z , 2 он орёт
"Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."
Z = comport.Read(buffer,0,bytes). Вот эту Z я и имел ввиду.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 16:05  [ТС] 30
Спасибо большое , работает , но почему то пакеты он очччень долго принимает , и из-за этого график очень медленно строится , а мне надо в реальном времени , т.е. я вывожу пульс на график , а пакеты очень медленно принимаются , не могли бы вы подсказать что может мне помочь ?
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 16:23 31
попробуйте Portmon'ом или любым аналогичным сканером порта посмотреть на какие именно операции большие задержки происходят. По собственному опыту могу сказать, что на прием одного пакета с двумя сменами бита паритетности тратится порядка 40-60 мсек. Наиболее критические участки по времени это конфигурирование и открытие порта. Так же если возникают TimeOut ошибки. С физическим ком портом задержка составляет примерно до 500 мсек, а если использовать USB адаптер MOXA, то время считывания увеличивается в 1.7 раза, а задержка может составить более двух секунд. Честно говоря не зная программы сложно сказать где именно утечки возникают.
В качестве метода локализации места могу посоветовать вычислять время, необходимое на выполнение той или иной операции с портом и вести лог. Вообще странно что пульс строится нормально. А пульс строится по какому параметру?
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 16:28  [ТС] 32
Мои предположения что трабла здесь
C#
1
Temp.AddRange(buffer.ToList().GetRange(0, Z));
а именно в Z , т.е он ждёт пока ком порт не прочитает все данные , а после того как он прочитал он их начинает выводить =\

Добавлено через 2 минуты
Есть дивайс , который мериет пульс , вот он отсылает пакеты ком порту , он принимает и выводит на график , это всё должно быть в режиме реального времени , пульс строится по параметру
C#
1
lst.Add((long)Result);
lst - график
C#
1
Result - Temp[1] * 256 + Temp[0]
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 16:30 33
Цитата Сообщение от gslim921 Посмотреть сообщение
Мои предположения что трабла здесь
Temp.AddRange(buffer.ToList().GetRange(0, Z));
а именно в Z , т.е он ждёт пока ком порт не прочитает все данные , а после того как он прочитал он их начинает выводить =\
Точно не в этом месте, т.к. пока он данные не считает эта строка выполнятся не будет. А время таких преобразований в список, извлечение из него подсписка и добавление его в третий список занимает много времени при размерах исходного массива в несколько десятков тысяч значений. И то больше всего будет нагибать процессор. Даже копирование списков массивов размерами примерно 100 тыс х 254 занимает примерно 100 мсек на буковской корке 3ГГц.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 16:32  [ТС] 34
как не в этом месте ? построение графика идёт после того как он получает данные из ком порта , а так как у меня он тормозит с выводом пакетов , то и график тормозит
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 16:46 35
Цитата Сообщение от gslim921 Посмотреть сообщение
как не в этом месте ? построение графика идёт после того как он получает данные из ком порта , а так как у меня он тормозит с выводом пакетов , то и график тормозит
Это место только добавляет в список считанные данные. Так что тормозит не здесь. А вот при вызове метода Read запросто может. Чтобы тормозило в этом месте скорости ком порта не хватит. Для интереса добавьте следующие строчки кода:

C#
1
2
3
DateTime start = DateTime.Now;
Temp.AddRange(buffer.ToList().GetRange(0, Z));
double dt = (start - DateTime.Now).TotalMilliseconds;
И параметр dt выведите куда нибудь, хоть в файл.

Добавлено через 7 минут
При размере буфера 50 тыс и добавляемых 25 тыс с последующим удалением по два значения время обработки 40-50 мсек, а про буфере 10 тыс и 5 тыс добавляемых значений 2 мсек. Так что не в этом месте тормоза.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 16:49  [ТС] 36
эм , dt выдаёт 0000000000
но прикол в следующим ...
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
if(bytes!=0)
                {
                    // Считываем данные из буфера ком порта
                    buffer = new byte[bytes];
 
                    int Z = comport.Read(buffer, 0, bytes);
                    DateTime start = DateTime.Now;
                    Temp.AddRange(buffer.ToList().GetRange(0, Z));
                    double dt = (start - DateTime.Now).TotalMilliseconds;
                 //Добавляем данные в конец буфера необработанных данных
                    Temp.AddRange(buffer.ToList().GetRange(0, Z));
                        // Пока в нашем буфере больше 1 байта
                        while (Temp.Count == 2)
                        {
                            //Из первых 2-х байтов вычисляем Z
                            long Result = Temp[1] * 256 + Temp[0];
                            lst.Add((long)Result);
                            if (checkBox1.Checked == true)
                            {
                                Log2(LogMsgType.Incoming, Temp[0] + " " + Temp[1] + " ");
                            }
 
                            /// Удалить обработанный пакет, т.е. первые два байта
                            Temp.RemoveRange(0, 2);
                        }
                }
видите там Temp.AddRange(buffer......
2 раза повторяется ... так вот , если удалить один из них программа будет подвесать , но если их оставить то программа не будет виснуть НО значения Temp[0] и Temp[1] будут одинаковы - дилемма однако....
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 16:56 37
Цитата Сообщение от gslim921 Посмотреть сообщение
эм , dt выдаёт 0000000000
но прикол в следующим ...

видите там Temp.AddRange(buffer......
2 раза повторяется ... так вот , если удалить один из них программа будет подвесать , но если их оставить то программа не будет виснуть НО значения Temp[0] и Temp[1] будут одинаковы - дилемма однако....
C#
1
while (Temp.Count == 2)
Это что? Нужно Temp.Count>1. И по моему проблема именно в этом условии. Если за 1 раз придет пакет длинной больше чем два байта, то программа туда больше никогда не зайдет.
Второй повтор удалить однозначно.
ЗЫ. Выложите пожалуйста код с реализацией цикличного считывания пожалуйста. Проблема возможно кроется где-то там. Хотя отвечу я не раньше 9 по Москве. Через 5 минут домой ухожу.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 17:00  [ТС] 38
Temp.Count > 1 - это я экспериментировал , что с ==2 что с >1 одно и то же =\

Добавлено через 2 минуты
график строится , и пакеты приходят , но дело в том что ждать долго нужно , нужно ускорить процесс ... 1 точка где то за 10-15 сек ставится... а 1 точка = 1 Result , 1 Result = Temp[0] and Temp[1]
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
22.06.2011, 17:01 39
Цитата Сообщение от gslim921 Посмотреть сообщение
Temp.Count > 1 - это я экспериментировал , что с ==2 что с >1 одно и то же =\
Выложите пожалуйста код всей процедуры. Домой приеду посмотрю из за чего это может быть. И протестируйте каждый участок кода на время выполнения. Таким методом вы локализуете проблемный участок быстрее чем я до дома доберусь.
0
1 / 1 / 2
Регистрация: 01.06.2011
Сообщений: 161
22.06.2011, 17:05  [ТС] 40
эм каким образом я проверю время выполнения всего процесса ? я уверен на 80% что проблема заключается
C#
1
2
Temp.AddRange(buffer.ToList().GetRange(0, Z)); //здесь и 
int Z = comport.Read(buffer, 0, bytes);  //здесь
0
22.06.2011, 17:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2011, 17:05
Помогаю со студенческими работами здесь

График на C#
Нужно нарисовать график функции любой, координатную сетку сделал с помощью GDI+, теперь проблема...

График!
Есть список, в него задаются числовые значения. По нажатию кнопки строится график (ОХ-порядковый...

График эллипса
Доброго времени суток. Мне нужно получить все натуральные точки, удовлетворяющим условию:...

Построить график!
Можно ли стандартными средствами или другими построить график в С#? Точечный... помогите плз!!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru