Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
BIXTAR
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 23
#1

Получить среднее арифметическое принятых данных с последовательного порта

09.10.2017, 08:42. Просмотров 852. Ответов 8
Метки нет (Все метки)

Добрый день!
Столкнулся с такой задачей. Необходимо получить среднее арифметическое 8 значений принятых из последовательного порта.

Данные получаю в виде
03H0****

* - любые принятые числа

vb.net
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
Public Class Form1
Dim n1 As String
Dim P As Integer
 
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 1000
Timer1.Enabled = False
End Sub
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Button1.Tag = 0 Then
            Button1.Tag = 1
SerialPort1.BaudRate = "9600"
SerialPort1.Open()
Timer1.Enabled = True
        Else
            Button1.Tag = 0
SerialPort1.Close()
Timer1.Enabled = False
        End If
End Sub
 
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
n1 = SerialPort1.ReadExisting()
        If Microsoft.VisualBasic.Left(n1, 4) = "03H0" Then
            P = Microsoft.VisualBasic.Right(n1, 5)
        End If
Label1.Text = P 'Данные получаю и отображаются в цифрах вида "****". К примеру "0250"
End Sub
 
End Class

Необходимо чтобы каждое новое полученное значение с последовательного порта складывалось с последующими 8 новых значений и получить среднее арифметическое уже в Label1.Text
К примеру получено 8 новых значений 0255 + 0321 + 0244 + ..... + 0251 после чего все полученные значения делятся на 8 и получаем результат в Label1.Text. После получения среднего значения, начинать вычисление следующие 8 значений, а предыдущий результат обнулить.

Заранее благодарю за помощь!!!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2017, 08:42
Ответы с готовыми решениями:

Организовать приём байтов из буфера последовательного порта SerialPort
Всем здравствуйте. Подскажите, пожалуйста, кто работал с последовательным...

Получить квадратную матрицу A по правилу и найти среднее арифметическое элементов второстепенной диагонали
Получить квадратную матрицу A размером NхN (N – случайное число от 7 до 9)...

Как получить номер КОМ-порта зная VID и PID
Как получить номер COM-порта зная VID и PID? Кто нить сталкивался? Хочу,...

Среднее арифметическое элементов массива
Здравствуйте! Помогите пожалуйста! Заранее спасибо. Вот задачка: ...

Найти среднее арифметическое элементов матрицы
Ребят нужна помощь, условие задачи такое Найти среднее арифметическое...

8
SoftIce
comment ca va
10444 / 3953 / 1008
Регистрация: 27.07.2011
Сообщений: 9,555
Завершенные тесты: 1
09.10.2017, 10:37 #2
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        n1 = SerialPort1.ReadExisting()
        If Microsoft.VisualBasic.Left(n1, 4) = "03H0" Then
            P = Microsoft.VisualBasic.Right(n1, 5)
        End If
 
        Dim n As Integer = 8
        Static k As Integer = 0, arr(n - 1) As Integer
        arr(k) = Val(P)
        k += 1
        If k >= n Then
            k = 0
            Dim sum As Integer = 0
            For i As Integer = 0 To n - 1
                sum += arr(i)
            Next
            Label1.Text = Math.Round(sum / n, 2).ToString
        End If
 
 
        'Label1.Text = P 'Данные получаю и отображаются в цифрах вида "****". К примеру "0250"
    End Sub
0
BIXTAR
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 23
11.10.2017, 10:50  [ТС] #3
Благодарю! Всё сработало, но появился ещё один нюанс. Как мне выставить условие таким образом чтобы исключить значение 3000 и продолжить выполнение цикла да тех пор пока не появятся значения меньше 3000?!
0
SoftIce
comment ca va
10444 / 3953 / 1008
Регистрация: 27.07.2011
Сообщений: 9,555
Завершенные тесты: 1
11.10.2017, 11:02 #4
Цитата Сообщение от BIXTAR Посмотреть сообщение
да тех пор пока не появятся значения меньше 3000
Ничего не понял.

Что делать со значениями больше 3000?
Равно 3000 ?
Вот появилось значение меньше 3000, что делаем?
0
BIXTAR
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 23
11.10.2017, 12:34  [ТС] #5
Всё что меньше 3000, подсчитывает правильно. А вот значение = 3000 нужно чтобы пропускал(исключал) из цикла и считал все последующие значения которые ниже 3000 до конца выполнения цикла из 8. Значений выше 3000 в порт не поступают.

Сделаю к примеру из 8 полученных значений:
0289 + 0340 + 0315 + 3000 + 0291 + 0412 + 3000 + 3000

Из этих 8 значений нужно исключить все "3000" и завершить цикл только в том случае когда все значения будут меньше "3000".
0
SoftIce
comment ca va
10444 / 3953 / 1008
Регистрация: 27.07.2011
Сообщений: 9,555
Завершенные тесты: 1
11.10.2017, 12:53 #6
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        n1 = SerialPort1.ReadExisting()
        If Microsoft.VisualBasic.Left(n1, 4) = "03H0" Then
            P = Microsoft.VisualBasic.Right(n1, 5)
        End If
 
        Dim n As Integer = 8
        Static k As Integer = 0, arr(n - 1) As Integer
      If Val(P) < 3000 Then
           arr(k) = Val(P)
           k += 1
           If k >= n Then
                k = 0
                Dim sum As Integer = 0
                For i As Integer = 0 To n - 1
                   sum += arr(i)
                Next
            Label1.Text = Math.Round(sum / n, 2).ToString
            End If
       End If
 
        'Label1.Text = P 'Данные получаю и отображаются в цифрах вида "****". К примеру "0250"
    End Sub
0
BIXTAR
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 23
12.10.2017, 11:02  [ТС] #7
Спасибо большое за помощь! Завтра буду тестировать, напишу что получилось

Добавлено через 22 часа 4 минуты
Всё работает. Спасибо. Ещё один вопрос интересует такой. Можно ли задать условие таким образом, чтобы из 8 полученных значений, если 3000 выпало 5 раз или во всём цикле 8 раз выпало 3000, то передать Label1.Text = "----"

К примеру:

Если

0289 + 0340 + 3000 + 3000 + 0291 + 3000 + 3000 + 3000

или

3000 + 3000 + 3000 + 3000 + 3000 + 3000 + 3000 + 3000

То передать Label1.Text = "----"
0
SoftIce
comment ca va
10444 / 3953 / 1008
Регистрация: 27.07.2011
Сообщений: 9,555
Завершенные тесты: 1
12.10.2017, 13:12 #8
Лучший ответ Сообщение было отмечено BIXTAR как решение

Решение

vb.net
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
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        n1 = SerialPort1.ReadExisting()
        If Microsoft.VisualBasic.Left(n1, 4) = "03H0" Then
            P = Microsoft.VisualBasic.Right(n1, 5)
        End If
        Dim n As Integer = 8, n5 As Integer = 5, maxValue As Integer = 3000
        Static k As Integer = 0, m As Integer = 0, arr(n - 1) As Integer, stc(n - 1) As Integer
        If Val(P) < maxValue Then
            arr(k) = Val(P)
            k += 1
            If k >= n Then
                k = 0 : m = 0
                Dim sum As Integer = 0
                For i As Integer = 0 To n - 1
                    sum += arr(i)
                Next
                Label1.Text = Math.Round(sum / n, 2).ToString
            End If
        Else
            m += 1
            If m >= n Then Label1.Text = "----" : k = 0 'если 3000 и больше выпало 8 раз подряд
        End If
        Dim cntMaxVal As Integer = 0
        For i As Integer = 0 To n - 1
            If i < n - 1 Then stc(i) = stc(i + 1) Else stc(n - 1) = Val(P)
            If stc(i) >= maxValue Then cntMaxVal += 1
        Next
        If cntMaxVal >= n5 Then Label1.Text = "----" : k = 0 'если 3000 и больше выпало 5 раз  в серии
    End Sub
1
BIXTAR
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 23
13.10.2017, 22:42  [ТС] #9
Благодарю за помощь! Всё работает, тема закрыта.
0
13.10.2017, 22:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2017, 22:42

Найти среднее арифметическое столбцов матрицы
Выдает индекс за пределами диапазона, укажите пожалуйста ошибку, битые часы уже...

Определить среднее арифметическое элементов массива
срочно нужна помощь,желательно в vb2013 Дан массив b(m,n). определить среднее...

Найти среднее арифметическое элементов матрицы
Получить квадратную матрицу A размером NN (N – случайное число от 4 до 10) ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru