C# 为什么我的应用程序在连接到串行端口时两次导航到主页时停止响应?
我正在开发一个简单的UWP应用程序,它需要监听一个连接到esp32的串行端口,esp32连接了一个rfid阅读器 它需要接收卡的UID,导航到新页面,然后在计时器结束或单击按钮后导航回原始页面 除了导航回原始父页面的部分之外,其他部分都正常工作。我相信这是因为应用程序正在尝试重新连接到串行端口,但它不可用。我已经通过创建一个带有串行连接设置的设置按钮来测试了我的理论,它确实按照预期工作 那么,每次重新加载页面时,Page_Loaded是否都会触发?是否有只在首次加载表单时触发的函数?我根本无法处理串行端口,我只是得到一个未处理的异常。我没有问题保持串行端口打开,但这似乎也造成了问题 请参见下面的一些示例代码:C# 为什么我的应用程序在连接到串行端口时两次导航到主页时停止响应?,c#,uwp,serial-port,C#,Uwp,Serial Port,我正在开发一个简单的UWP应用程序,它需要监听一个连接到esp32的串行端口,esp32连接了一个rfid阅读器 它需要接收卡的UID,导航到新页面,然后在计时器结束或单击按钮后导航回原始页面 除了导航回原始父页面的部分之外,其他部分都正常工作。我相信这是因为应用程序正在尝试重新连接到串行端口,但它不可用。我已经通过创建一个带有串行连接设置的设置按钮来测试了我的理论,它确实按照预期工作 那么,每次重新加载页面时,Page_Loaded是否都会触发?是否有只在首次加载表单时触发的函数?我根本无法处
private async void setupCOM()
{
string qFilter = SerialDevice.GetDeviceSelector("COM4"); //please note this is hard coded to COM4 - probably need to modify this at some point.
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(qFilter);
if (devices.Any())
{
string deviceId = devices.First().Id;
await OpenPort(deviceId);
}
ReadCancellationTokenSource = new CancellationTokenSource();
while (true)
{
await Listen();
}
}
我试图在加载的页面上启动setupCOM函数,它在第一次加载页面时工作,但在第二次导航页面时不工作
private async Task ReadAsync(CancellationToken cancellationToken)
{
Task<UInt32> loadAsyncTask;
uint ReadBufferLength = 64; // only when this buffer would be full next code would be executed
dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); // Create a task object
UInt32 bytesRead = await loadAsyncTask; // Launch the task and wait until buffer would be full
if (bytesRead > 0)
{
string strFromPort = dataReaderObject.ReadString(bytesRead);
int fstLetter = strFromPort.IndexOf("Info");
int lstLetter = strFromPort.IndexOf("Info", fstLetter + 1);
if ((fstLetter >= 0) && (lstLetter > 0)) strFromPort = strFromPort.Substring(fstLetter, lstLetter - fstLetter);
Debug.WriteLine(strFromPort);
Debug.WriteLine("Read at " + DateTime.Now.ToString(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.LongTimePattern));
//txtresult.Text = strFromPort;
//serialPort.Dispose();
this.Frame.Navigate(typeof(user_login), strFromPort);
//navpage();
}
}
private async Task ReadAsync(CancellationToken CancellationToken)
{
任务加载异步任务;
uint ReadBufferLength=64;//仅当此缓冲区已满时,才会执行下一个代码
dataReaderObject.InputStreamOptions=InputStreamOptions.Partial;
loadAsyncTask=dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken);//创建任务对象
UInt32 bytesRead=wait loadAsyncTask;//启动任务并等待缓冲区已满
如果(字节读取>0)
{
string strFromPort=dataReaderObject.ReadString(bytesRead);
int fstLetter=strFromPort.IndexOf(“信息”);
int lstLetter=strFromPort.IndexOf(“Info”,fstLetter+1);
如果((fstLetter>=0)和(&(lstLetter>0))strFromPort=strFromPort.Substring(fstLetter,lstLetter-fstLetter);
Debug.WriteLine(strFromPort);
Debug.WriteLine(“在”+DateTime.Now.ToString(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.LongTimePattern)读取);
//Text=strFromPort;
//serialPort.Dispose();
this.Frame.Navigate(typeof(用户登录),strFromPort);
//导航页面();
}
}
上面的函数读取并处理接收到的字符串,然后传递到新的用户登录表单
下一个表单有一个15秒的倒计时,在此之后表单将导航回主页。但它只是停止了对一切的反应。我很确定这是因为它试图重新连接到com端口
有人有什么想法吗
这非常令人沮丧,所以如果有人能帮助我,我将永远感激:)
谢谢
安德鲁
那么,每次重新加载页面时,Page_Loaded是否都会触发
对
是否有只在首次加载表单时触发的函数
您可以使用布尔标志来确定是否执行方法:
private bool _hasBeenLoaded;
private void OnLoaded(object sender, RoutedEventArgs e)
{
if (!_hasBeenLoaded)
{
_hasBeenLoaded = true;
//your code to be executed only once...
}
}
可能需要使用缓存主页面,以便可以导航回正确保存以前设置的主页面。详情如下:
<page NavigationCacheMode="Required" />
哇,真管用!事实上,我认为我自己让问题变得更糟了。我试图禁用NavigationCacheMode,希望它会破坏页面并再次打开。我想我没有完全理解缓存。但是,是的,必需的工作非常好,谢谢:)太好了,谢谢你的帮助。这种方法也有效!我不知道每次导航回页面时都会触发页面加载。我在寻找一个Page_创建的函数或类似的东西。“Page_创建的”是页面的构造函数。