在 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;
我需要向激光传感器发送命令。它通过 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;