2

我正在开发 USB 通信 UWP APP。我可以毫无问题地获得 SerialDevice 实例,但是当我调用 myDevice.OutputStream.FlushAsync() 时,我没有得到已实现的异常。

这是我的代码

private async void EstablishConButton_Click(object sender, RoutedEventArgs e)
    {
        var DeviceSelector = SerialDevice.GetDeviceSelector();
        var Devices = await DeviceInformation.FindAllAsync(DeviceSelector);
        var deviceInfo = Devices.FirstOrDefault();

        SerialDevice myDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);

        if (myDevice == null)
        {
            Debugg("Device not found!");
            return;
        }
        Debugg("Device found!");

        byte[] buffer = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05 , 0x05 , 0x05 , 0x05 , 0x05 , 0x05 };
        var rBuffer = (buffer).AsBuffer();
        await myDevice.OutputStream.WriteAsync(rBuffer);

        await myDevice.OutputStream.FlushAsync();

        var responseBufer = (new byte[11]).AsBuffer();
        await myDevice.InputStream.ReadAsync(responseBufer, 11,InputStreamOptions.None);

    }

我的清单:

<DeviceCapability Name="usb">
        <Device Id="vidpid:0403 6015">
            <Function Type="name:vendorSpecific" />
        </Device>
    </DeviceCapability>

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

谢谢您的回复

4

2 回答 2

0

它在msdn上说“要写入数据,首先通过使用 OutputStream 属性从 SerialDevice 对象获取输出流,然后使用 DataWriter 对象写入实际缓冲区。”

所以尝试改用 DataWriter,您的代码将如下所示:

var DeviceSelector = SerialDevice.GetDeviceSelector();
var Devices = await DeviceInformation.FindAllAsync(DeviceSelector);
var deviceInfo = Devices.FirstOrDefault();

SerialDevice myDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);

if (myDevice == null)
{
    Debug.WriteLine("Device not found!");
    return;
}
Debug.WriteLine("Device found!");

byte[] buffer = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05 };
var rBuffer = (buffer).AsBuffer();

using (var dataWriter = new DataWriter(myDevice.OutputStream))
{
    dataWriter.WriteBuffer(rBuffer);
}

var responseBufer = (new byte[11]).AsBuffer();
await myDevice.InputStream.ReadAsync(responseBufer, 11, InputStreamOptions.None);

在这里您不必调用 dataWriter.FlushAsync() 因为它假设在处理时自动刷新,但如果出现任何问题 - 添加刷新并再次检查。

于 2016-06-06T20:07:31.350 回答
0

讨论很晚,但是在遇到同样的问题后,在我的搜索中没有发现任何有用的东西,这就是我的结论......

问题是实际上并没有使用 write 命令发送字节(至少不是立即发送)。

对 writer.FlushAsync() 的调用确实会导致字节输出,但随后会引发 NotImplementedException。

答案是:writer.StoreAsync()。这会导致字节立即传输,更重要的是,不会引发异常。

于 2021-02-05T23:50:52.097 回答