осциллограф на Visual Basic

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
neox
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб мар 10, 2012 21:14:01

осциллограф на Visual Basic

Сообщение neox »

Здравствуйте!!! Вопрос к знатокам visual basic. Я в этом языке совсем еще "зеленый" :P так что прошу прошу помощи у знатоков. Хочу написать тут прогу осциллографа как из этого ролика https://www.youtube.com/watch?v=X9I3nYCa8P4 смогу сказать что с comport-ом уже разобрался и данные поступающие с атмеги запросто считываю. Использую "CHART"-график для визуализации данных, только вот не могу в него числа с comport-а никак вложить !!! код следующий

Код: Выделить всё

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = True
        Try
            SerialPort1.Open()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

     
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       
        Chart1.Series("Series1").Points.Add(SerialPort1.ReadExisting()) 'ПРОБЛЕММА ЗДЕСЬ
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        SerialPort1.PortName = ComboBox1.Text
    End Sub

    Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
        SerialPort1.BaudRate = ComboBox2.Text
    End Sub
End Class


ПОМОГИТЕ ПЛИЗ СОВЕТОМ КАК ПРАВИЛЬНО СДЕЛАТЬ ! :idea:
P.S пишу в visual studio 2010
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: осциллограф на Visual Basic

Сообщение menzoda »

Во-первых, надо подробнее описывать проблему. Что не так? Не рисуется график? Ругается компилятор? Надо помочь с алгоритмом? Что? Какой формат данных? Как их нужно отобразить?

Во-вторых, что бросилось в глаза - SerialPort1.ReadExisting() возвращает строку, а Points.Add() вероятно желает получить все же числа, а не строку. Так что берешь свои данные из ком порта, преобразовываешь их в числа, и добавляешь в график.
neox
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб мар 10, 2012 21:14:01

Re: осциллограф на Visual Basic

Сообщение neox »

да совершенно верно у меня ругается компилятор. задача простая считывать байт с ком-порта и записывать его в график попробывал так Chart1.Series("Series1").Points.Add(SerialPort1.ReadByte) все скомпилировалась но тоже что то не так, застревает на определенной цифре и все! хотя я меняю показание переменного резистора на аналоговом входе мк
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: осциллограф на Visual Basic

Сообщение uk8amk »

Не знаю как там сейчас chart работает, но раньше ему требовался на входе вариантный массив хотя бы 2-мерный. По одной оси идут названия точек отсчетов(строки) по другой - числа.
Исходя из этого нужно порезать строку с компорта на масив соответсвующего формата. Кстати, неполохие примеры работы можно глянуть в MSDN.

И еще, chart имхо более пригоден для рисования графиков для экономической и статистической отчетности. Для такой штуки как осцилл лучше сразу рисовать на PictureBox.
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: осциллограф на Visual Basic

Сообщение menzoda »

neox писал(а):застревает на определенной цифре и все! хотя я меняю показание переменного резистора на аналоговом входе мк

Так, что значит застревает? Давай все проверять по очереди.

Сначала убери ReadByte() и подставь вместо него просто число, ну или какой-нибудь Random.Next(). Таким образом убедись, что сам график и добавление в него чисел работают, ну или не работают.

Далее, переделай участок кода чтения из порта. Смотри, согласно MSDN ReadByte() может возвращать -1 и выкидывать исключения InvalidOperationException (порт не открыт) и TimeoutException (истекло время ожидания). То есть нельзя просто так засунуть readByte() в Series.Add() и надеяться, что все будет хорошо. Заключи этот участок в блок try-catch и обрабатывай должным образом исключения, например, выводи сообщение об ошибке, ну или что хочешь.

Вообще, на исключение TimeoutException можно никак не реагировать. Подумаешь, истекло время ожидания, ну и что? Значит данных пока нет, возможно при следующем вызове они появятся. То есть всю программу убивать необязательно. Однако, даже, если ты не собираешься обрабатывать это исключение, соответствующий блок catch все-равно должен присутствовать - чтобы исключение не "улетело наверх". Просто оставь его тело пустым. Но на этапе отладки все же рекомендую что-то выводить.

Плюс, сделай проверку на -1, и, если, она появиться, то глуши таймер и так же выводи сообщение. Ибо -1 означает конец потока, читать там уже нечего. Хотя, в случае ком порта я не уверен, что это означает именно это. Помнится я где-то читал, что комовский ReadByte() вообще никогда не возвращает -1. Но мало ли...

Ну и напоследок. Вызывать в обработчике таймера блокирующие функции, типа ReadByte(), не комильфо. Обработчик таймера вызывается в главном потоке, поэтому если он надолго застрянет в ожидании байтов от ком порта (это зависит от значения ReadTimeout), то твой интерфейс просто перестанет реагировать. Лучше делать это в фоновом потоке, но это так на будущее, пока можешь не заморачиваться.
neox
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб мар 10, 2012 21:14:01

Re: осциллограф на Visual Basic

Сообщение neox »

большое спасибо за помощь!!! все оказалось намного проще :)) в vb написал так:

Код: Выделить всё

 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
         
        Static Dim x As Decimal = 0
        Static Dim y As Decimal = 0
        x = x + 1
        Chart1.Series("Series1").Points.AddXY(x, SerialPort1.ReadExisting())
End Sub

а в atmegu так:

Код: Выделить всё

printf("%d\n\r",read_adc(0));
(для codevision) и все арбайтен гуд!!! :tea:
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: осциллограф на Visual Basic

Сообщение menzoda »

Ок. Но исключения все-равно надо обрабатывать.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: осциллограф на Visual Basic

Сообщение Alexeyslav »

И всеравно... этот подход не самый удачный. Сейчас у тебя все держится на том что комп успевает принимать и обработать данные быстрее чем они поступают. А если возникнет затык? По какой-либо причине... в считанные секунды переполнится буффер порта и алес-капут. Надо как-то регулировать это обратной связью вроде "горшочек не вари". А лучше ограничить количество отсчетов выдаваемых контроллером - выдал 512(к примеру) отсчетов и ждет следующей команды или очередного условия старта(напряжение превысило порог и т.п.) и готовности компьютера принять данные. Если компьютер не готов принимать(не отрисовал предыдущую картинку) - нет смысла передавать данные.
Так работают все аппаратные цифровые осциллографы.

Впрочем, в вашем случае если программа выводить данные будет немного медленней чем они поступают - просто со временем изображение будет все сильней и сильней отставать от реального сигнала до тех пор пока не случится переполнение буфера порта или виндовс.
Ответить

Вернуться в «Интеграция с ПК»