我正在用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转换器一起工作,但我不想使用它。
下面是一个代码示例:
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
发布于 2018-10-10 16:33:31
您正在接收的错误可能发生在各种用例中。但我猜设备的容量并没有设置为串行访问。
确保在package.appxmanifest中启用串行通信设备功能。
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort"/>
</Device>
</DeviceCapability>
</Capabilities>
UWP在覆盆子Pi上使用时不会产生适当的SerialDevice.GetDeviceSelector。
SerialDevice.GetDeviceSelector("COM0")
不像在Windows10Desktop上那样显示IoT核心上的COM端口。
另外,如果您试图使用除了车载UART之外的串行设备,或者FTDI串行设备,除非您在Pi上安装了Pi驱动程序,否则它将无法工作。这是不可能的,因为我还没有找到除了FTDI之外的制造商为Windows提供驱动程序。(ala CH340)
Windows.Devices.SerialCommunication名称空间充其量是片状的。我愿意接受,我的麻烦是我自己的设计,但由于缺乏支持,这就像拔牙,以得到一个稳定的解决方案。每一次迭代增强都提供了它们自己的一组困难。
这是我在过去一周里学到的关于Raspberry Pi系列通讯的主题。
这里是我如何初始化一个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应该是可行的,但对我来说并非如此。
https://stackoverflow.com/questions/51560396
复制相似问题