SerialDevice IsRequestToSendEnabled Raspberry Pi

Я программирую на vb и у меня есть проект UWP с использованием Raspberry Pi.

Когда я использую конвертер USB в RS485, я могу использовать IsRequestToSendEnabled из SerialDevice для синхронизации связи между Raspberry и PLC, но когда я пытаюсь использовать UART с конвертером TTL в RS485, IsRequestToSendEnabled недоступен.

Появляется следующая ошибка:

Запрос не поддерживается. (Исключение из HRESULT: 0x80070032)

А также

System.AccessViolationException HResult=0x80004003 Сообщение = Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

UART не поддерживает это? Я не эксперт в UART, так как же тогда синхронизировать кадры связи в Modbus? TTL для RS485 - полудуплекс, я предполагаю, что мне нужно как-то синхронизировать связь. Он работает с конвертером USB в RS485, но я не хочу его использовать.

Вот пример кода:

    Private Async Function ListAvailablePorts() As Task(Of Boolean)
        Try
            Dim aqs As String = SerialDevice.GetDeviceSelector("UART0") '"UART0") '"COM1")
            Dim _portlist As DeviceInformationCollection = Await DeviceInformation.FindAllAsync(aqs, Nothing)

            client = Await SerialDevice.FromIdAsync(_portlist(0).Id)
            client.ReadTimeout = TimeSpan.FromMilliseconds(1000)
            client.WriteTimeout = TimeSpan.FromMilliseconds(1000)
            client.BaudRate = 9600
            client.Parity = SerialParity.None
            client.DataBits = 8
            client.StopBits = SerialStopBitCount.One
            client.Handshake = SerialHandshake.None ' SerialHandshake.None ' SerialHandshake.XOnXOff ' SerialHandshake.RequestToSend
            client.IsRequestToSendEnabled = False ' error here when using UART
            client.IsDataTerminalReadyEnabled = False

            Return True
        Catch ex As Exception
            Debug.WriteLine("Error listing ports: " & ex.Message)
            Return False
        End Try

    End Function

1 ответ

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

Обязательно включите возможность устройства последовательной связи в package.appxmanifest.

   <Capabilities>
      <Capability Name="internetClient" />
      <DeviceCapability Name="serialcommunication">
         <Device Id="any">
            <Function Type="name:serialPort"/>
         </Device>
      </DeviceCapability>
   </Capabilities>

UWP на Raspberry Pi не будет производить правильный SerialDevice.GetDeviceSelector при использовании

SerialDevice.GetDeviceSelector("COM0")

Устройства USB-Serial не отображаются как COM-порты в Window IoT Core, как на Windows 10 Desktop.

Кроме того, если вы пытаетесь использовать последовательное устройство ДРУГОЕ, чем встроенное UART, или последовательное устройство FTDI, оно не будет работать, если вы не получите драйверы для Pi, установленного на Pi. Что маловероятно, так как я еще не нашел производителя, кроме FTDI, предоставляющего драйверы для Windows IoT Core. (аля CH340)

Пространство имен Windows.Devices.SerialCommunication в лучшем случае нестабильно. Я согласен с тем, что мои проблемы имеют собственный дизайн, но из-за отсутствия поддержки это все равно что тянуть зубы, чтобы получить стабильное решение. Каждая итерация улучшения создает свой набор трудностей.

Вот то, что я узнал за последнюю неделю на тему "Последовательное общение на Raspberry Pi".

  1. Последовательное устройство, с которым вы можете общаться, должно быть устройством FTDI.
  2. Вам нужно обойти короткие ошибки GetDeviceSelector и FindAllAsync. (без "COM1") селектор.
  3. DataReader.LoadAsync будет ожидать до тех пор, пока не будет заполнена ВСЯ буферная длина, которую вы предоставляете.
  4. Следовательно, обработка буфера длиной 1 обеспечивает наилучший способ получения данных любой длины.
  5. DataReader.LoadAsync будет ждать всегда в первый раз после того, как вы что-то напишите на последовательное устройство. Предоставьте токен отмены и попробуйте снова. (Обратите внимание, что это, вероятно, мой собственный недостаток / непонимание)
  6. Когда вы закончите запись на устройство - отсоедините поток писателя, прежде чем пытаться читать, и наоборот.
  7. И большое - вы должны держать serialDevice открытым столько, сколько вам нужно. НЕ пытайтесь утилизировать SerialDevice до тех пор, пока ваша программа не закроется - она ​​зависнет.

Вот как я инициализирую устройство FTDI USB-Serial.

var aqs = SerialDevice.GetDeviceSelector();
var devices = await DeviceInformation.FindAllAsync(aqs);
var deviceInfo = devices?.Where(i => i.Name == "FT232R USB UART").FirstOrDefault();

Я проверил ВСЕ устройства и выбрал уникальное свойство для выбора моего устройства. Предположительно, использование SerialDevice.GetDeviceSelectorFromUsbVidPid должно работать, но это не для меня.

Другие вопросы по тегам