我正在用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
答案 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上串行通信主题中学到的东西。
这是我初始化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应该可以,但是对我来说不行。