На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> работа с RS-232 , Visual Basic работа с RS-232
    Здравствуйте форумчане.
    Сразу оговорюсь, я не программист, но кое какие знания у меня есть.
    Так что сильно меня не убивайте.
    Проблема вот какая:
    нужно отослать команду B1 66 01 00 00 00 00 02 A7 8D 00 по rs-232 и получить ответ приблизительный такой: B3 66 00 00 01 00 00 05 AD 8D 00 00 00
    Dim arCommand(10) As Byte
    arCommand(0) = &HB1
    arCommand(1) = &H66
    arCommand(2) = &H1
    arCommand(3) = &H0
    arCommand(4) = &H0
    arCommand(5) = &H0
    arCommand(6) = &H0
    arCommand(7) = &H2
    arCommand(8) = &HA7
    arCommand(9) = &H8D
    arCommand(10) = &H0
    SerialPort1.Write(arCommand, 0, 10)
    For i = 1 To 10 'Delay
    Threading.Thread.Sleep(10)
    Application.DoEvents()
    Next
    Dim test As String
    test = SerialPort1.ReadExisting

    Попробовал так, но ответа не получил.
    Мовет кто то подскажет как правильно.
    Спасибо
      1. Взять какую-либо программу-терминал и проверить, что устройство действительно отвечает, т.е. оно работоспособно и выставлены верные установки порта

      2. Задать такие же настройки в своей программе, ожидание подольше, и убедиться, что хоть что-то приходит

      3. Для практической работы стоит реализовать асинхронный режим с использованием события порта DataReceived
        Есть программа, так и называется терминал как MBo написал, там есть возможность отправить в порт из файла. Возьми типа WinHex что-нибудь, туда ты скопируешь типа "B1 66 01 00 00 00 00 02 A7 8D 00".
          Я использовал программу COM Port Toolkit 4.0 там все работает, порт отвечает
          я не понимаю как релализовать это в visual basic
            А порт открыть с нужными параметрами не забыл? Есть от майрософта программа для отслеживания что происходит на портах portmon.
              With SerialPort1
              Try
              _SerialPort1.PortName = nPort
              Catch ex As Exception
              'comOpen = False
              Console.WriteLine("Error Open: " & ex.Message)
              MsgBox("COM Port Connection Is Missing ")
              Exit Sub
              End Try
              _SerialPort1.BaudRate = 230400
              SerialPort1.Parity = IO.Ports.Parity.None
              SerialPort1.DataBits = 8
              SerialPort1.StopBits = IO.Ports.StopBits.One
              ' Set the read/write timeouts
              SerialPort1.ReadTimeout = 60000
              SerialPort1.WriteTimeout = 10000

              End With
              Try
              SerialPort1.Open()
              Catch ex As Exception
              'comOpen = False
              Console.WriteLine("Error Open: " & ex.Message)
              MsgBox("COM Port Connection Is Missing ")
              Exit Sub
              End Try

              так я открываю порт


              А Вот так я работал с другим портом. И там все работает . Правда я посылал стринг "U"
              With SerialPort1
              Try
              _SerialPort1.PortName = nPort
              Catch ex As Exception
              'comOpen = False
              Console.WriteLine("Error Open: " & ex.Message)
              MsgBox("COM Port Connection Is Missing ")
              Exit Sub
              End Try
              _SerialPort1.BaudRate = 9600
              SerialPort1.Parity = IO.Ports.Parity.None
              SerialPort1.DataBits = 8
              SerialPort1.StopBits = IO.Ports.StopBits.One
              End If
              ' Set the read/write timeouts
              SerialPort1.ReadTimeout = 60000
              SerialPort1.WriteTimeout = 10000

              End With
              Try
              SerialPort1.Open()
              Catch ex As Exception
              'comOpen = False
              Console.WriteLine("Error Open: " & ex.Message)
              MsgBox("COM Port Connection Is Missing ")
              Exit Sub
              End Try
              SerialPort1.Write("U" & vbCr) ' sending "U" to serial Port
              For i = 1 To 10 'Delay
              Threading.Thread.Sleep(10)
              Application.DoEvents()
              Dim returnStr = ""
              SerialPort1.Encoding = System.Text.Encoding.GetEncoding("Windows-1251") 'encoding to ASCII

              returnStr = SerialPort1.ReadExisting
                Ты выделяешь 10 байт, а пишешь 11 arCommand(10) = &H0

                как у тебя не падает на этом?

                Добавлено
                И пишешь 10 SerialPort1.Write(arCommand, 0, 10)
                  От 0 до 10 это и есть 11 byte
                    Dim arCommand(10) As Byte

                    Я не понимаю в VB но это выделение массива на 10 байт.
                    Этот байт куда пишется? arCommand(10) = &H0
                      Цитата ter_nk_ @

                      Спасибо, я исправил , но проблема не в этом.

                      Добавлено
                      Попробую задать вопрос по другому:
                      Как вместо "U"
                      SerialPort1.Write("U" & vbCr)
                      В этои строке послать B1 66 01 00 00 00 00 02 A7 8D 00 во это?
                        Цитата ter_nk_ @
                        Я не понимаю в VB но это выделение массива на 10 байт.Этот байт куда пишется? arCommand(10) = &H0

                        Прикреплённый файлПрикреплённый файлarray.jpg (32,35 Кбайт, скачиваний: 508)
                          В общем зделал так:

                          Dim arCommand() As Byte = {&HB1, &H66, &H1, &H0, &H0, &H0, &H0, &H2, &HA7, &H8D, &H0}
                          SerialPort1.Write(arCommand, 0, arCommand.Length)
                          For i = 1 To 10 'Delay
                          Threading.Thread.Sleep(10)
                          Application.DoEvents()
                          Next
                          Threading.Thread.Sleep(10)
                          Application.DoEvents()
                          Next
                          Dim Count As Integer = SerialPort1.BytesToRead
                          Dim Buffer(0 To Count - 1) As Byte
                          Dim Text2Display As String = ""
                          SerialPort1.Read(Buffer, 0, Count)
                          For I As Integer = 0 To Buffer.GetUpperBound(0)
                          Text2Display += Buffer(I).ToString("X2") & " "
                          Next

                          Спасибо за помощь
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0372 ]   [ 18 queries used ]   [ Generated: 28.03.24, 14:26 GMT ]