Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个线程试图使用串行端口将数据传递给另一个线程_C#_Wpf_Multithreading_Serial Port_Dispatcher - Fatal编程技术网

C# 一个线程试图使用串行端口将数据传递给另一个线程

C# 一个线程试图使用串行端口将数据传递给另一个线程,c#,wpf,multithreading,serial-port,dispatcher,C#,Wpf,Multithreading,Serial Port,Dispatcher,在过去的两天里,我一直在做一些事情,但没有解决办法 我编写了一个类,其中一个对象是“SerialPort”.NET类。 在我的主窗口中,我创建了名为“SerialPortComm”的类的实例,然后通过我的一些函数向串行端口发送命令,并通过“DataReceived”事件接收应答 但是,当我尝试使用Dispatcher.BeginInvoke写入我(成功)收到的数据时,我尝试写入的RichTextBox上没有显示任何内容 是什么原因造成的,我怎样才能让它起作用 SerialPortComm.cs(

在过去的两天里,我一直在做一些事情,但没有解决办法

我编写了一个类,其中一个对象是“SerialPort”.NET类。
在我的主窗口中,我创建了名为“SerialPortComm”的类的实例,然后通过我的一些函数向串行端口发送命令,并通过“DataReceived”事件接收应答

但是,当我尝试使用Dispatcher.BeginInvoke写入我(成功)收到的数据时,我尝试写入的RichTextBox上没有显示任何内容

是什么原因造成的,我怎样才能让它起作用

SerialPortComm.cs编辑

命令.cs

class Commands
{
   public void SetCommand(SerialPortComm sp, string command)
   {
       sp.SetStringDataFromControl(sp.mySerialPort, command); 
   }
}
public partial class MainWindow : Window
{

   Commands cmd = new Commands();
   SerialPortComm sp1 = new SerialPortComm();  

   public MainWindow()
   {
       InitializeComponent();
       sp1.Open_Port("COM6", 115200);
   }

   private async void TextBox_input_KeyDown(object sender, KeyEventArgs e)
   {
       if (e.Key == Key.Enter)
       {
           cmd.SetCommand(sp1, "top");
           cmd.SetCommand(sp1, "run");
           // .... //
       }
   }
}
MainWindow.cs

class Commands
{
   public void SetCommand(SerialPortComm sp, string command)
   {
       sp.SetStringDataFromControl(sp.mySerialPort, command); 
   }
}
public partial class MainWindow : Window
{

   Commands cmd = new Commands();
   SerialPortComm sp1 = new SerialPortComm();  

   public MainWindow()
   {
       InitializeComponent();
       sp1.Open_Port("COM6", 115200);
   }

   private async void TextBox_input_KeyDown(object sender, KeyEventArgs e)
   {
       if (e.Key == Key.Enter)
       {
           cmd.SetCommand(sp1, "top");
           cmd.SetCommand(sp1, "run");
           // .... //
       }
   }
}

我认为您已经阻止了UI线程,请尝试通过线程池线程调用
COM
消息:

public void SetCommand(SerialPortComm sp, string command)
{
   Task.Factory.StartNew( () => {
      sp.SetStringDataFromControl(sp.mySerialPort, command); 
 });
}
唯一的问题是这些调用不能保证按顺序运行和完成。您可能需要调整以使调用按顺序排队和使用。通过
Concurrent
collections命名空间查看生产者/消费者模式

或者,您也可以通过在自己的专用(单个)线程中调用所有命令来避免并发问题,如下所示:

   if (e.Key == Key.Enter)
   {
     Task.Factory.StartNew( () => {
       cmd.SetCommand(sp1, "top");
       cmd.SetCommand(sp1, "run");
       // .... //
     });
   }

这可能是一个更简单的实现。

谢谢,但这对我不起作用。RichTextBox上仍然没有显示任何内容。该代码正确吗?您是否记录它以确保安全?UI是否已锁定/冻结?UI未锁定或冻结。当我处于调试模式时,我看到“DataRx”变量包含我从串行端口收到的正确响应答案(字符串)(在向它发送一些命令之后),但当我试图使用“Dispatcher.BeginInvoke((Action)delegate()”将其打印到日志时,什么也没有发生(尽管通过该行通过OK,我没有得到任何异常)。不是真的…如果您得到文本,并且在添加文本时看到代码执行并完成…则您设置的颜色使其不可见,或者有其他我不知道的情况。