SerialDevice IsRequestToSendEnabled Raspberry Pi

时间:2018-07-27 14:44:22

标签: raspberry-pi2 uart modbus rs485

我正在用vb编程,并使用Raspberry Pi进行了UWP项目。

当我使用USB到RS485转换器时,可以使用SerialDevice上的IsRequestToSendEnabled来同步Raspberry和PLC之间的通信,但是当我尝试将UART与TTL到RS485转换器一起使用时,IsRequestToSendEnabled不可用。

出现以下错误:

  

不支持该请求。 (来自HRESULT的异常:0x80070032)

  

System.AccessViolationException     HResult = 0x80004003     Message =尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

UART不支持它?我不是UART方面的专家,那么如何在Modbus中同步通信帧? RS485的TTL为半双工,我想我必须以某种方式同步通信。它可以与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 个答案:

答案 0 :(得分:0)

您收到的错误可能在各种用例中发生。但是我猜测该设备的功能未设置为串行访问。

确保在package.appxmanifest中启用串行通信设备功能。

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

使用

时,Raspberry Pi上的UWP不会生成正确的SerialDevice.GetDeviceSelector。
SerialDevice.GetDeviceSelector("COM0")

USB串行设备在Windows IoT Core上不像Windows 10 Desktop上那样显示为COM端口。

此外,如果您尝试使用板载UART以外的串行设备或FTDI串行设备,则除非您在Pi上安装了Pi的驱动程序,否则它将无法工作。这不太可能,因为我尚未找到FTDI以外的制造商为Windows IoT核心版提供驱动程序。 (ala CH340)

Windows.Devices.SerialCommunication命名空间充其量是不稳定的。我乐于接受我的麻烦是我自己设计的,但是由于缺乏支持,这就像拔牙获得稳定的解决方案一样。每次增强功能都会带来自己的困难。

这是我过去一周在Raspberry Pi上串行通信主题中学到的东西。

  1. 您可以与之通信的串行设备必须是FTDI设备。
  2. 您需要解决GetDeviceSelector和FindAllAsync的不足。 (没有“ COM1”)选择器。
  3. DataReader.LoadAsync将等待,直到您提供的整个bufferLength被填满。
  4. 因此,处理缓冲区长度为1的最佳方法是获取任何长度的数据。
  5. DataReader.LoadAsync将在您向串行设备中写入内容后的第一次永久等待。提供取消令牌,然后重试。 (请注意,这可能是我自己的缺点/缺乏理解)
  6. 完成向设备的写入后-在尝试读取之前分离作家的流,反之亦然。
  7. 还有一个很大的问题-您必须在需要时保持serialDevice处于打开状态。在程序关闭之前,请不要尝试处置SerialDevice-它会挂起。

这是我初始化FTDI USB串行设备的方式。

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

我所做的工作都检查了所有设备,并选择了唯一的属性来选择我的设备。据说,使用SerialDevice.GetDeviceSelectorFromUsbVidPid应该可以,但是对我来说不行。