0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
1

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

09.10.2017, 08:42. Показов 1204. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2017, 08:42
Ответы с готовыми решениями:

Обработка данных принятых с COM-порта
Добрыйдень опытные коллеги))) Помогите с алгоритмом обработки данных принятых с ком-порта. Есть...

Отображение данных принятых с ком порта (C# windows forms)
Есть контроллер ардуино. Если на него послать через ком порт on контакт 1 будет замкнут, если off...

Распределение данных с последовательного порта
Имеется такой код в VB6 Private Sub Command1_Click() MSComm1.CommPort = 2 MSComm1.Settings =...

Как поток данных с последовательного порта записать в массив типа char
Как реализовать запись символов приходящих с последовательного порта в массив char? Например при...

8
es geht mir gut
11264 / 4746 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
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
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
11.10.2017, 10:50  [ТС] 3
Благодарю! Всё сработало, но появился ещё один нюанс. Как мне выставить условие таким образом чтобы исключить значение 3000 и продолжить выполнение цикла да тех пор пока не появятся значения меньше 3000?!
0
es geht mir gut
11264 / 4746 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
11.10.2017, 11:02 4
Цитата Сообщение от BIXTAR Посмотреть сообщение
да тех пор пока не появятся значения меньше 3000
Ничего не понял.

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

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

Из этих 8 значений нужно исключить все "3000" и завершить цикл только в том случае когда все значения будут меньше "3000".
0
es geht mir gut
11264 / 4746 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
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
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
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
es geht mir gut
11264 / 4746 / 1183
Регистрация: 27.07.2011
Сообщений: 11,437
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
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
13.10.2017, 22:42  [ТС] 9
Благодарю за помощь! Всё работает, тема закрыта.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2017, 22:42
Помогаю со студенческими работами здесь

Получить массив их 2 заданных, элементы которого есть среднее арифметическое соответствующих элементов данных массивов
Задать два двумерных массива, у которых число строк не равно числу столбцов. Получить третий...

Процедуры: Получить y = 5,3*a+(a2+6,7)/sin(a+b), где a – среднее арифметическое в массиве C, b –среднее арифметическое в массиве D
помогите решить Следующее условие:Даны 2 массива C (i = 1– n), D (k = 1 – m). Получить y = 5,3 * a...

Получить среднее арифметическое по трем предметам ученика и среднее по каждому предмету всех студентов
есть список студентов и оценки по трем предметам(химия, физика , алгебра пусть будут) , нужно...

Получить среднее арифметическое и среднее геомерическое элементов последовательности
Даны действительные числа a1, a2… Известно, что а1&gt;0 и что среди a2, a3… есть хотя бы одно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru