- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
希望这里有人能够帮助我。我正在创建一个 c# UWP 应用程序以在 Raspberry Pi2/Windows IOT 核心上运行。我需要从 2 个串行设备(由外部按钮/PLC 触发)读取输入以计算一些值。我一次可以读取其中一个设备,但到目前为止还无法获得两者的值。我的序列代码基于一个例子,我试图从主页调用它。到目前为止,无论我做了什么更改,第一个设备返回一个值,第二个不返回(串行处理程序中等待的任务立即返回 null,而不是等待一个值通过串行端口传来)。
编辑:在进行了一些额外的故障排除后,我发现了以下内容 - 当我尝试停止调试时,Visual Studio 卡住(无法进行 UI 交互,但调试监控仍在更新),停止此操作的唯一方法是拔掉插头我的笔记本电脑(以及串行到 USB 电缆)的底座,此时 VS 再次正常运行。此外,我似乎在串行端口上 while(true) 循环的第二次迭代中收到错误“请求的资源正在使用中。(HRESULT 异常:0x800700AA)”不起作用。
调用串口的代码为:
private async Task listenForDeviceInput()
{
string weight;
string area;
//var areaTask = cognosCamera.Listen();
//var weightTask = weighTable.Listen();
Task <string> areaTask = cognosCamera.Listen();
Task <string> weightTask = weighTable.Listen();
await Task.WhenAll(areaTask, weightTask);
weight = await weightTask;
area = await areaTask;
weight = weight.TrimEnds("\r");
area = area.TrimEnds("\r");
AddNewHide(weight, area);
saveHide();
listenForDeviceInput(); //removed the await here to see what happens
}
串行处理在这里:
// Copyright (c) Microsoft. All rights reserved.
using System;
using System.Collections.ObjectModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;
using Windows.Storage.Streams;
using System.Threading;
using System.Threading.Tasks;
namespace SerialDeviceHandler
{
public sealed partial class SerialPort
{
/// <summary>
/// Private variables
/// </summary>
private SerialDevice serialPort = null;
DataWriter dataWriteObject = null;
DataReader dataReaderObject = null;
private ObservableCollection<DeviceInformation> listOfDevices;
private CancellationTokenSource ReadCancellationTokenSource;
/// <summary>
/// ListAvailablePorts
/// - Use SerialDevice.GetDeviceSelector to enumerate all serial devices
/// - Attaches the DeviceInformation to the ListBox source so that DeviceIds are displayed
/// </summary>
/// <summary>
/// comPortInput_Click: Action to take when 'Connect' button is clicked
/// - Get the selected device index and use Id to create the SerialDevice object
/// - Configure default settings for the serial port
/// - Create the ReadCancellationTokenSource token
/// - Start listening on the serial port input
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public async Task OpenSerialPort(string entry)
{
try
{
serialPort = await SerialDevice.FromIdAsync(entry);
if (serialPort == null) return;
// Configure serial settings
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;
// Create cancellation token object to close I/O operations when closing the device
ReadCancellationTokenSource = new CancellationTokenSource();
//Listen();
}
catch (Exception ex)
{
//status.Text = ex.Message;
//comPortInput.IsEnabled = true;
//sendTextButton.IsEnabled = false;
}
}
/// <summary>
/// WriteAsync: Task that asynchronously writes data from the input text box 'sendText' to the OutputStream
/// </summary>
/// <returns></returns>
/// <summary>
/// - Create a DataReader object
/// - Create an async task to read from the SerialDevice InputStream
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public async Task<String> Listen()
{
string result;
try
{
if (serialPort != null)
{
dataReaderObject = new DataReader(serialPort.InputStream);
// keep reading the serial input
while (true)
{
result = await ReadAsync(ReadCancellationTokenSource.Token);
if(result != "Nothing" || result == null)
{
return result;
}
}
}
return "Failed";
}
catch (TaskCanceledException tce)
{
//status.Text = "Reading task was cancelled, closing device and cleaning up";
CloseDevice();
return "Task Cancelled";
}
catch (Exception ex)
{
//status.Text = ex.Message;
return "Task Errored";
}
finally
{
// Cleanup once complete
if (dataReaderObject != null)
{
dataReaderObject.DetachStream();
dataReaderObject = null;
}
}
}
/// <summary>
/// ReadAsync: Task that waits on data and reads asynchronously from the serial device InputStream
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
private async Task<string> ReadAsync(CancellationToken cancellationToken)
{
Task<UInt32> loadAsyncTask;
uint ReadBufferLength = 1024;
// If task cancellation was requested, comply
cancellationToken.ThrowIfCancellationRequested();
// Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available
dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
{
// Create a task object to wait for data on the serialPort.InputStream
loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(childCancellationTokenSource.Token);
// Launch the task and wait
UInt32 bytesRead = await loadAsyncTask;
if (bytesRead > 0)
{
return dataReaderObject.ReadString(bytesRead);
//status.Text = "bytes read successfully!";
}
return "Nothing";
}
}
/// <summary>
/// CancelReadTask:
/// - Uses the ReadCancellationTokenSource to cancel read operations
/// </summary>
public void CancelReadTask()
{
if (ReadCancellationTokenSource != null)
{
if (!ReadCancellationTokenSource.IsCancellationRequested)
{
ReadCancellationTokenSource.Cancel();
}
}
}
/// <summary>
/// CloseDevice:
/// - Disposes SerialDevice object
/// - Clears the enumerated device Id list
/// </summary>
private void CloseDevice()
{
if (serialPort != null)
{
serialPort.Dispose();
}
serialPort = null;
//comPortInput.IsEnabled = true;
//sendTextButton.IsEnabled = false;
//rcvdText.Text = "";
listOfDevices.Clear();
}
/// <summary>
/// closeDevice_Click: Action to take when 'Disconnect and Refresh List' is clicked on
/// - Cancel all read operations
/// - Close and dispose the SerialDevice object
/// - Enumerate connected devices
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void closeDevice_Click(object sender, RoutedEventArgs e)
{
try
{
//status.Text = "";
CancelReadTask();
CloseDevice();
//ListAvailablePorts();
}
catch (Exception ex)
{
//status.Text = ex.Message;
}
}
}
据我所知,这 2 个串行端口对象似乎已正确创建(基于这样一个事实:如果我注释掉另一个的初始化,我可以从每个对象中获取一个值)。我将 2 个串行对象初始化为:
private async System.Threading.Tasks.Task InitializeSerialDevicesAsync()
{
weighTable = new SerialPort();
cognosCamera = new SerialPort();
await weighTable.OpenSerialPort(scaleComPort);
await cognosCamera.OpenSerialPort(cameraComPort);
}
我知道我可能只是在做一些愚蠢的事情,但我们将不胜感激任何帮助。在这一点上,我只是想在我必须开始处理 Pi 上的驱动程序问题等之前让它在普通 PC 上运行。
最佳答案
好的 - 所以我已经解决了问题,但不太明白为什么。我将 USB 转串行电缆更换为不同品牌(从 prolific 到 FTDI),现在应用程序在笔记本电脑和 pi 上都能正常运行。
关于c# - 无法从 UWP 应用程序中的 2 个串行设备读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259030/
uwp 和非 uwp 应用程序之间是否可以进行通信。我的非uwp是一个提供服务的后台任务。我想在 uwp 应用程序中调用该非 uwp 服务。 如何调用电话? AppServiceConnection
我正在开发一个应用程序,该应用程序旨在在具有多个显示器(从 1 到 3必要)在每个监视器上,每个监视器都显示不同的 View 。 就我所见,UWP 并不自然适用于这种情况。我设法使用 CoreAppl
我正在尝试对UWP应用使用broadFileSystemAccess功能,但是package.appxmanifest的功能列表中未列出broadFileSystemAccess功能。 我的最低和最高
有时我有一个打开的流或一个事件的队列,必须在应用程序关闭时正确处理。在 WPF 应用程序中,我可以在应用程序上使用 Unloading 事件,但在 UWP 中我注意到这样的事件不存在。 我如何可靠地做
http://wikisend.com/download/880354/UWP_Server.zip 我已将代码上传至上述网址。 它是 UWP 中的客户端和服务器应用程序。这里客户端和服务器都在同一个
大家好 我知道这个问题(Chromium working on UWP)之前(2015/2016)有人问过,想看看有没有更新 我正在尝试在 UWP 应用程序中使用 CEF3 构建,但在运行该应用程序时
我目前正在构建一个应用程序,它可以使用 Windows 游戏 DVR 在某个时刻开始录制屏幕。该录音机在完成录音时将应用程序名称作为文件名。 我发现了如何使用 Applicationview.GetF
我已使用 Desktop App Converter 将我的 WPF 应用程序转换为 appx 包。我需要在资源管理器上下文菜单中有一个项目。 IE。用户右键单击文件并在主菜单中看到我的项目“对应用程
我想稍微修改一个 Button 控件(添加描述)。在哪里可以找到 UWP 控件的默认控件模板? 最佳答案 似乎可以在以下位置找到它们: C:\Program Files (x86)\Windows K
我想通过 UWP 应用访问 windows10 注册表项。 键为:\HKEY_LOCAL_MACHINE\SOFTWARE\MyCompanyName\MyName 我找不到任何函数调用来完成它。 请
我开发了一个 UWP appx,它可以安装在 cmd.exe 提示符中: C:\test>myapp.appx 但是在安装过程中会弹出一个 Windows GUI。 有没有什么方法 使用 Silent
在我的 UWP 应用程序中,如何通过 UpdateTask 中的代码进行调试? VS 2017 中的“生命周期事件”下拉菜单似乎没有提供触发此类后台任务的选项。有办法实现吗? 最佳答案 首先是关于 U
我尝试在 VS 2017 中创建一个 UWP 应用程序包。 创建时我收到一条神秘的错误消息:严重性代码描述项目文件行抑制状态错误 0xdef00532 - 资源“Files/Assets/Square
我有一个 TextBlock在我的应用程序中。我要办理pinch in & out在它上面调整字体的大小。当ManipulationDelta事件触发我检查Scale属性(property),但大多数
为什么默认选择的索引不起作用?它因平台异常而崩溃: RumTime 错误: Exception thrown at 0x00007FFDEF7F7788 (KernelBase.dll) in ab
有没有办法在同一个包中的 UWP 应用程序和桌面桥应用程序之间共享互斥锁?它们似乎有不同的命名空间;使用相同的名称不会在进程之间产生相同的对象。根据 WinObj,UWP 应用程序的对象是,存储在 A
有什么方法可以检测当前的 UWP 要退出 ? (由用户关闭或终止进程) 我想向服务器发送一些关于应用程序将断开连接的请求,还想在退出之前保存一些数据。 最佳答案 无法检测这种情况或阻止用户终止您的应用
我正在使用 XAML 和 C# 开发通用 Windows 平台应用程序。我想在 UWP 中更改焦点上 TextBox 的边框颜色。 在此先感谢您的帮助。 最佳答案 其实实现起来很简单,按照以下步骤即可
是否可以在 UWP 应用中更改甚至隐藏鼠标指针? 我唯一能找到的是: Windows.UI.Xaml.Window.Current.CoreWindow.PointerCursor = null; 但
我是一名优秀的程序员,十分优秀!