我想为Raspberry Pi创建一个无头应用程序,涉及从串口读取数据。
Microsoft的示例应用程序工作正常,但它具有用户界面。
在创建无头应用程序时,我将所有相关部分如下所示:
var aqs = SerialDevice.GetDeviceSelector();
var dis = await DeviceInformation.FindAllAsync(aqs);
foreach (var t in dis)
{
if (t.Id.Contains("FTDI"))
{
listOfDevices.Add(t);
}
}
if (listOfDevices.Count == 1)
{
DeviceInformation entry = listOfDevices[0];
try
{
serialPort = await SerialDevice.FromIdAsync(entry.Id);
serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.BaudRate = 9600;
serialPort.Parity = SerialParity.None;
serialPort.StopBits = SerialStopBitCount.One;
serialPort.DataBits = 8;
serialPort.Handshake = SerialHandshake.None;
...
有一条USB-FTDI电缆,ID包含“FTDI”,如下所示:
serialPort = await SerialDevice.FromIdAsync(entry.Id);
程序在程序实例消失之前到达此行并忽略我的断点。
有什么想法吗?
答案 0 :(得分:0)
我使用您的代码并在Package.appxmanifest中添加以下行。
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
它对我有用。
<强>更新强>
根据您的项目(发送给我),因为ListAvailablePorts()是异步操作,您需要use the GetDeferral method to get a background task deferral to keep the host process from being suspended or terminated before the asynchronous operation complete。您可以像这样编辑代码:
BackgroundTaskDeferral _deferral = null;
public async void Run(IBackgroundTaskInstance taskInstance)
{
_deferral = taskInstance.GetDeferral();
//
// TODO: Insert code to start one or more asynchronous methods
//
try
{
//var u = new USART();
//await u.Initialize(115200, SerialParity.None, SerialStopBitCount.One, 8);
listOfDevices = new ObservableCollection<DeviceInformation>();
ListAvailablePorts();
}
...
}
异步操作完成后调用_deferral.Complete()
。