我试图与串口通信进行聊天。这个聊天必须在WPF项目中有一个界面,我已经创建了我的界面和所有内容。我被困在通过串口接收响应。我已经尝试从串口添加一个DataReceived事件,但我担心我错误地使用它,因为我之前从未在C#中编程。这是一个非常简单的代码。 我需要做的是从串口接收信息并将其显示在文本块中,就像在简单的聊天窗口中看到的那样。
InitializeComponent();
_serialPort = new SerialPort();
foreach (string s in SerialPort.GetPortNames())
{
listaComs.Items.Add(s);
}
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
visor.Inlines.Add("Data Received:");
visor.Inlines.Add(indata);
}
private void enviarClick(object sender, RoutedEventArgs e)
{
_serialPort.WriteLine(escribir.Text);
visor.Inlines.Add("Yo: " + escribir.Text + Environment.NewLine);
}
private void cambiarTexto(object sender, MouseButtonEventArgs e)
{
if (escribir.Text == "Escriba su texto")
{
escribir.Text = "";
}
}
private void inicializarSerial()
{
// Poner las propiedades correctas.
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.StopBits = StopBits.One;
_serialPort.DataBits = 8;
_serialPort.Handshake = Handshake.None;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
// Poner los timeouts de escritura y lectura
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
}
private void conectarCom(object sender, RoutedEventArgs e)
{
string seleccion = listaComs.SelectedItem.ToString();
_serialPort.PortName = seleccion;
inicializarSerial();
_serialPort.Open();
_continue = true;
visor.Text = "";
}
private void desconectarCom(object sender, RoutedEventArgs e)
{
_serialPort.Close();
}
当我在.exe文件中运行它时,它崩溃了InvalidOperationException
内部异常(已翻译):
"实现呼叫的子进程无法获得对此的访问权限 object,因为propietary是另一个子进程。"
答案 0 :(得分:1)
事件是从调用它们的线程触发的,对于串行端口(或任何通信层),这将肯定不在UI线程上。
但是,UI操作必须在UI线程上完成。所以下面的代码将会失败:
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
visor.Inlines.Add("Data Received:");
visor.Inlines.Add(indata);
因为您正在从错误的线程修改UI元素。解决方案是使用BeginInvoke
(MSDN)将操作封送到UI线程:
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Dispatcher.BeginInvoke(() =>
{
visor.Inlines.Add("Data Received:");
visor.Inlines.Add(indata);
}, null);
PS。你的例外翻译似乎没有问题;如果这是问题,您将看到的例外是(英文):
跨线程操作无效:从其他线程访问控制 而不是它创建的线程。
(或类似的东西)。我没有认识到提供的文本,并且根据您的代码,看起来这就是您遇到的内容。