在 UWP 中向串口设备发送命令

Sending commands to a serial device in UWP

我需要向激光传感器发送命令。它通过 RS232 转 USB 适配器连接到 USB。

它使用 "old" SerialPort class 工作,这意味着激光接收命令并打开(我可以看到光束 3 秒,然后它消失,如预期的那样)。代码是这样的:

private void OpenAndCloseLaser()
        {
            serialPort = new SerialPort();
            serialPort.PortName = "COM1";
            serialPort.BaudRate = 19200;
            serialPort.DataBits = 7;
            serialPort.StopBits = StopBits.One;
            serialPort.Parity = Parity.Even;

            serialPort.Open();

            //initialization command
            serialPort.WriteLine("s0c");

            //open laser
            serialPort.WriteLine("s0o");

            Thread.Sleep(3000);
            //shut down laser
            serialPort.WriteLine("s0p");

            serialPort.Close();
        }

我尝试使用基于此 tutorial 的 SerialDevice class 复制相同的功能。

代码是这样的:

首先我找到了设备(它工作正常,我得到 "COM1" 作为 PortName)

private async Task GetDeviceAsync()
        {
            string aqs = SerialDevice.GetDeviceSelector();

            var dis = await DeviceInformation.FindAllAsync(aqs);

            device = await SerialDevice.FromIdAsync(dis[0].Id);

            device.BaudRate = 19200;
            device.DataBits = 7;
            device.StopBits = SerialStopBitCount.One;
            device.Parity = SerialParity.Even;
            device.ReadTimeout = TimeSpan.FromMilliseconds(2000);
            device.WriteTimeout = TimeSpan.FromMilliseconds(2000);

            device.ErrorReceived += Device_ErrorReceived;
        }

这是我用来向它发送命令的:

 private async Task WriteCommand(string command)
        {

            var dataWriter = new DataWriter(device.OutputStream);

            dataWriter.WriteString(command);
            await dataWriter.StoreAsync();

            dataWriter.DetachStream();
            dataWriter = null;

        }

这就是我发送实际命令的方式:

private async Task OpenAndCloseLaser()
        {
            //initialize
            await WriteCommand(INIT_COMMAND);
            // open laser
            await WriteCommand("s0o");

            await Task.Delay(3000);
            //shutdown laser
            await WriteCommand("s0p");
        }

当使用 SerialDevice class 和 DataWriter 时,似乎没有发送命令...激光没有打开和关闭,我没有收到任何错误。有什么想法吗?

这里的问题是我没有用 command.The "old" 发送 \r\n 终止。带有 SerialPort class 的 .Net Framework 默认情况下可能会这样做(该方法称为 WriteLine)。

所以现在它适用于此:

device.IsDataTerminalReadyEnabled = true;
            device.IsRequestToSendEnabled = true;

            var dataWriter = new DataWriter(device.OutputStream);

            dataWriter.WriteString(command + "\r\n");

            await dataWriter.StoreAsync();

            dataWriter.DetachStream();
            dataWriter = null;

还有这个:

device.IsDataTerminalReadyEnabled = true;
        device.IsRequestToSendEnabled = true;

        var dataWriter = new DataWriter(device.OutputStream);

        byte[] message = System.Text.Encoding.ASCII.GetBytes(command + "\r\n");
        dataWriter.WriteBytes(message);

        await dataWriter.StoreAsync();

        dataWriter.DetachStream();
        dataWriter = null;