Пример чтения строки из ком порта вопрошаю

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Пример чтения строки из ком порта вопрошаю

Сообщение tunduk » 14.10.2018 (Вс) 10:17

Помогите, пожалуйста, найти пример чтения строки из com-порта.
Или ткните носом в то место где это описано.
Спасибо

VB.net у меня отправляет команду для нескольких ардуинок сидящих на одном порту.
Та ардуинка, чей номер в сообщении отвечает. Это вроде получается.

Далее VB.net принимает от ардуинки информацию ... с байтами у меня ни чего не получилось получал только один байт вместо двух от датчика.
Решил попробовать принимать в виде текста, вообще ничего не получается прочитать.

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: Пример чтения строки из ком порта вопрошаю

Сообщение tunduk » 14.10.2018 (Вс) 13:12

Изменил какой-то найденный код. Данные пришлось разделить на три блока. За одно отправление все 16 измерений и 16 символов (по типу 11001100 11110000) не принимались.

Ощущение стойкое, что делаю все через жопу...

В примере принятые байты записывается в лабел1, а в лабел2 принятые символы
Код: Выделить всё
    Private Sub SerialPort1_DataReceived()'ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

      Dim arrBuffer(300) As Byte
      Dim intSize As Integer

   While SerialPort1.BytesToRead() > 0
         intSize = SerialPort1.Read(arrBuffer, 0, 300)

         label1.Text = System.BitConverter.ToString(arrBuffer, 0, intSize) 
         
         label2.Text=""
         For i=0 to 300
         label2.Text = label2.Text & Chr(arrBuffer(i))
         Next i
   End While
End Sub

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Пример чтения строки из ком порта вопрошаю

Сообщение pronto » 15.10.2018 (Пн) 12:27

Недавно поднимался вопрос по совокуплению Arduino с Basic'ом. Конечно, конкретных решений там нет, но общие принципы расписаны очень хорошо
O, sancta simplicitas!

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: Пример чтения строки из ком порта вопрошаю

Сообщение tunduk » 15.10.2018 (Пн) 15:18

Спасибо, Пронто.

Я таки плюнул на передачу символами и замутил передачу байтами выглядит это так, если кому понадобиться:
Код: Выделить всё
   
   Sub Timer2Tick(sender As Object, e As EventArgs)  ' раз в 150 милисек к уно уходит запрос , потом комп слушает ком порт
      PrintByte 'Запрос
      
      SerialPort1.Open()
      SerialPort1_DataReceived11  'ПРИЕМ
      SerialPort1.Close()      
   End Sub
   
   ' - - - - - - - - - - - - - - - - - - - -- - - -- ------------------------------------------------------
   
   Private Sub PrintByte()'ByVal value As Integer)
      ' ВЫЗОВ ПЕРВОГО
   SerialPort1.Open()
   SerialPort1.Write({255},0,1)', 0, bytes.Length)
   SerialPort1.Write({255},0,1)', 0, bytes.Length)
   SerialPort1.Write({1},0,1)', 0, bytes.Length)
   SerialPort1.Close()      
   
   End Sub
   
   ' - - - - - - - - - - - - - - - - - - - -- - - -- ------------------------------------------------------

   Private Sub SerialPort1_DataReceived11()  ' Прием и "дешифровка"

              
      Dim arrBuffer(350) As Byte
      Dim intSize As Integer
      Dim a1(50) As String
      
       SerialPort1.ReadTimeout = 600
      While SerialPort1.BytesToRead() > 0
      intSize = SerialPort1.Read(arrBuffer, 0, 350)

      label1.Text = System.BitConverter.ToString(arrBuffer, 0, intSize)  ' принятые байты
' принимаемое сообщение выглядит примерно так (РИС1)
         ' достаю из рис1 байты ... наверное можно было просто избавиться от "-" а потом в цикле обработать строку
         ' почему-то мозг отказался это оформить циклом  ... возможно можно быстрее если вместо бит конвертера, что-то другое использовать
         a1(1)=Mid(label1.Text, 1, 2)
         a1(2)=Mid(label1.Text, 4, 2)
         a1(3)=Mid(label1.Text, 7, 2)
         a1(4)=Mid(label1.Text, 10, 2)
         a1(5)=Mid(label1.Text, 13, 2)
         a1(6)=Mid(label1.Text, 16, 2)
         a1(7)=Mid(label1.Text, 19, 2)
         a1(8)=Mid(label1.Text, 22, 2)
         a1(9)=Mid(label1.Text, 25, 2)
         a1(10)=Mid(label1.Text, 28, 2)
         a1(11)=Mid(label1.Text, 31, 2)
         a1(12)=Mid(label1.Text, 34, 2)
         a1(13)=Mid(label1.Text, 37, 2)
         a1(14)=Mid(label1.Text, 40, 2)
         a1(15)=Mid(label1.Text, 43, 2)
         a1(16)=Mid(label1.Text, 46, 2)
         a1(17)=Mid(label1.Text, 49, 2)
         a1(18)=Mid(label1.Text, 52, 2)
         a1(19)=Mid(label1.Text, 55, 2)
         a1(20)=Mid(label1.Text, 58, 2)
         a1(21)=Mid(label1.Text, 61, 2)
         a1(22)=Mid(label1.Text, 64, 2)
         a1(23)=Mid(label1.Text, 67, 2)
         a1(24)=Mid(label1.Text, 70, 2)
         a1(25)=Mid(label1.Text, 73, 2)
         a1(26)=Mid(label1.Text, 76, 2)
         a1(27)=Mid(label1.Text, 79, 2)
         a1(28)=Mid(label1.Text, 82, 2)
         a1(29)=Mid(label1.Text, 85, 2)
         a1(30)=Mid(label1.Text, 88, 2)
         a1(31)=Mid(label1.Text, 91, 2)
         a1(32)=Mid(label1.Text, 94, 2)
         a1(33)=Mid(label1.Text, 97, 2)
         
         label2.Text=""
         Dim b1(30) As String 
         
         b1(1)=a1(1)
         b1(2)=a1(2) & a1(3)
         b1(3)=a1(4) & a1(5)
         b1(4)=a1(6) & a1(7)
         b1(5)=a1(8) & a1(9)
         b1(6)=a1(10) & a1(11)
         b1(7)=a1(12) & a1(13)
         b1(8)=a1(14) & a1(15)
         b1(9)=a1(16) & a1(17)
         b1(10)=a1(18) & a1(19)
         b1(11)=a1(20) & a1(21)
         b1(12)=a1(22) & a1(23)
         b1(13)=a1(24) & a1(25)
         b1(14)=a1(26) & a1(27)
         b1(15)=a1(28) & a1(29)
         b1(16)=a1(30) & a1(31)
         b1(17)=a1(32) & a1(33)
            
         label2.Text = ""
         For i= 1 To 17
            label2.Text = label2.Text & "  "  & Hex_to_Dec(b1(i))
         Next
   ' расшифровка на  (РИС2)         
   
   End While
End Sub

Function Hex_to_Dec(ByVal heximal As String) As Integer   ' два байта типа "021В" перевести в число десятичное
        Dim Simvol As String
        Dim DesChislo As Integer
        Dim x As Integer
        Hex_to_Dec = 0
        For x = 1 To heximal.Length
            Simvol = Microsoft.VisualBasic.Mid(heximal, x, 1)
            If Simvol.ToUpper = "A" Then
                DesChislo = 10
            ElseIf Simvol.ToUpper = "B" Then
                DesChislo = 11
            ElseIf Simvol.ToUpper = "C" Then
                DesChislo = 12
            ElseIf Simvol.ToUpper = "D" Then
                DesChislo = 13
            ElseIf Simvol.ToUpper = "E" Then
                DesChislo = 14
            ElseIf Simvol.ToUpper = "F" Then
                DesChislo = 15
            Else
                DesChislo = CInt(Simvol)
            End If
            Hex_to_Dec = Hex_to_Dec + DesChislo * 16 ^ (heximal.Length - x)
        Next x
        Return Hex_to_Dec
    End Function

   
End Class


   


Изображение
РИС1

Изображение
РИС2

Теперь мне осталось найти как присвоить 16 разным переменным булевы значения из двух байт типа "11001100" "11110000" которые будут приняты по аналогии в 16-ричном виде.
Если можете, подскажите. Спасибо.

tunduk
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 17.08.2013 (Сб) 19:47

Re: Пример чтения строки из ком порта вопрошаю

Сообщение tunduk » 15.10.2018 (Пн) 17:27

Пока в голове такой алгоритм: Скажем приняли два байта 04 0С.
Это состояние 16 реле - каждый бит=одно реле, "04" - первые 8 реле, "0С" - вторые 8 реле.
тогда первый символ первого байта "0"- это первые 4 реле, "4" - вторые 4 реле, "0" - 3-тьи, "С" - 4-тые.
А теперь каждое реле из тетрады проверяем:
1 реле =1 если символ=8,9,А, B, C, D, E, F
2 реле =1 если символ=4,5,6, 7, C, D, E, F
3 реле =1 если символ=2,3,6, 7, A, B, E, F
4 реле =1 если символ=1,3,5, 7, 9, B, D, F
Остальные по аналогии.
Можно проще?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Пример чтения строки из ком порта вопрошаю

Сообщение pronto » 15.10.2018 (Пн) 21:13

Да, можно проще. На VB6 это будет выглядеть так:
Код: Выделить всё
Dim power2(31) As Long ' номер элемента массива соответствует номеру реле

' заполнение этого массива
Dim i As Long
For i = 0 To 30
   power2(i) = 2^i
Next i
power2(i) = power2(i) Or &H80000000

' включение нужного реле (установка соответствующего ей бита)
' во всех функциях предполагается, что нумерация реле начинается с единицы
Sub RelayON(ByRef RelayState As Long, Byval RelayNumber As Long)
If RelayNumber >= 1 And RelayNumber <= 16 Then
   RelayState = RelayState Or power2(RelayNumber - 1)
End If
End Sub

' выключение
Sub RelayOFF(ByRef RelayState As Long, Byval RelayNumber As Long)
If RelayNumber >= 1 And RelayNumber <= 16 Then
   RelayState = RelayState And Not(power2(RelayNumber - 1))
End If
End Sub

' Переключение
Sub RelayTOGGLE(ByRef RelayState As Long, Byval RelayNumber As Long)
If RelayNumber >= 1 And RelayNumber <= 16 Then
   If RelayState And power2(RelayNumber - 1) Then
      RelayState = RelayState And Not(power2(RelayNumber - 1))
   Else
      RelayState = RelayState Or power2(RelayNumber - 1)
   End If
End If
End Sub

' узнать состояние реле
Function GetRelayState(ByVal RelayState As Long, ByVal RelayNumber As Long) As Boolean
If RelayNumber >= 1 And RelayNumber <= 16 Then
   If RelayState And power2(RelayNumber - 1) Then
      GetRelayState = True
   Else
      GetRelayState = False
   End If
End If
End Function

В .Net заменить Long на Integer
O, sancta simplicitas!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 20

    TopList