首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SerialDevice IsRequestToSendEnabled覆盆子Pi

SerialDevice IsRequestToSendEnabled覆盆子Pi
EN

Stack Overflow用户
提问于 2018-07-27 14:44:21
回答 1查看 275关注 0票数 1

我正在用vb编程,并有一个使用Raspberry Pi的UWP项目。

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

显示以下错误:

不支持请求。(HRESULT例外: 0x80070032)

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

UART不支持它?我不是UART方面的专家,那么如何同步Modbus中的通信帧呢?TTL到RS485是半双工的,我想我必须以某种方式同步通信.它确实与USB到RS485转换器一起工作,但我不想使用它。

下面是一个代码示例:

代码语言:javascript
运行
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-10 16:33:31

您正在接收的错误可能发生在各种用例中。但我猜设备的容量并没有设置为串行访问。

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

代码语言:javascript
运行
复制
   <Capabilities>
      <Capability Name="internetClient" />
      <DeviceCapability Name="serialcommunication">
         <Device Id="any">
            <Function Type="name:serialPort"/>
         </Device>
      </DeviceCapability>
   </Capabilities>

UWP在覆盆子Pi上使用时不会产生适当的SerialDevice.GetDeviceSelector。

代码语言:javascript
运行
复制
SerialDevice.GetDeviceSelector("COM0")

不像在Windows10Desktop上那样显示IoT核心上的COM端口。

另外,如果您试图使用除了车载UART之外的串行设备,或者FTDI串行设备,除非您在Pi上安装了Pi驱动程序,否则它将无法工作。这是不可能的,因为我还没有找到除了FTDI之外的制造商为Windows提供驱动程序。(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串行设备.

代码语言:javascript
运行
复制
var aqs = SerialDevice.GetDeviceSelector();
var devices = await DeviceInformation.FindAllAsync(aqs);
var deviceInfo = devices?.Where(i => i.Name == "FT232R USB UART").FirstOrDefault();

我所做的是检查所有设备,并选择一个唯一的属性来选择我的设备。据推测,使用SerialDevice.GetDeviceSelectorFromUsbVidPid应该是可行的,但对我来说并非如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51560396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档