串口通讯显示

2024-02-24

我正在尝试通过串行端口通信进行聊天。这个聊天必须在 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有内部异常(翻译):

“实现该调用的子进程无法获得对此的访问权限 对象,因为专有是另一个子流程。”


事件是从调用它们的线程中触发的,在串行端口(或任何通信层)的情况下,这将确实不在 UI 线程上。

但是,UI 操作must在 UI 线程上完成。所以下面的代码将会失败:

    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    visor.Inlines.Add("Data Received:");
    visor.Inlines.Add(indata);

因为您正在从错误的线程修改 UI 元素。解决方案是使用BeginInvoke (MSDN http://msdn.microsoft.com/en-us/library/cc190824(v=vs.110).aspx) 将操作编组到 UI 线程上:

    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();

    Dispatcher.BeginInvoke(() =>
    {
       visor.Inlines.Add("Data Received:");
       visor.Inlines.Add(indata);
    }, null);

附言。你的例外的翻译似乎不正确;如果这是问题所在,您将看到的例外是(英文):

跨线程操作无效:从其他线程访问控制 比创建它的线程更重要。

(或者非常相似的东西)。我无法识别提供的文本,并且鉴于您的代码,看起来这就是您遇到的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口通讯显示 的相关文章

随机推荐

  • Gradle 和 Android:具有多个 Maven 工件发布的 pom 配置

    使用 Gradle v 1 7 作为构建工具开发 Android 库时 我使用了 Maven 插件并配置了任务 uploadArchives 将库的发布版本和调试版本发布到本地 Maven 存储库 下面的代码工作正常 apply plugi
  • 如何将语音焦点转移到我的模式?

    我使用的是 iPhone 6 并且打开了语音 辅助功能 选项 我在链接单击时打开了退出模式 并将键盘焦点设置在模式上 使用 js 这一切都很好 但是 焦点旁白并未切换到我的模式 它仍然位于触发链接上 如何将语音焦点转移到模式上 这是模态代码
  • 如何在 Appengine 上使用 xlrd 读取 excel 文件

    我在 appengine 中使用 xlrd 我用烧瓶 我无法读取输入文件 并且它不断显示相同的错误消息 代码是 def read rows inputfile rows wb xlrd open workbook inputfile sh
  • Apache 将规则重写为lighttpd

    如何将此apache重写规则转换为lighttpd重写规则 Turn on URL rewriting RewriteEngine On Installation directory RewriteBase adpanel Protect
  • git:错误:您需要首先解析当前索引[重复]

    这个问题在这里已经有答案了 我试图将一个分支与我的分支合并 但出现了合并冲突 看到冲突后 我决定恢复我的分支 但我不确定如何执行此操作 因为我通常运行以下命令的方法似乎无法重置我的分支 git fetch origin git reset
  • $_SERVER['HTTP_HOST'] = 不是我的服务器的 IP

    我的php脚本有 SERVER HTTP HOST 等于一个与我的服务器ip无关的ip 有人有简单的解释吗 我认为某些机器人正在发送完全错误的主机标头 但我认为它无法连接到具有错误主机标头的服务器 thx HTTP HOST由客户提供 在H
  • 如何修复奇怪的 NSLayoutConstraint 错误,这些错误似乎不会影响自定义 UITableViewCell 中的布局

    每次我的自定义 UITableViewCells 由 tableView cellForRowAtIndexPath 绘制时 控制台都会吐出一堆 NSLayoutConstraint 不一致的信息 我理解其中大部分 Unable to si
  • MS Access 2010 导入规范位置?

    我有一个 MS Access 数据库 其中外部数据内的已保存导入具有导入作业 这些作业实际上将某些数据从不同位置导入到某些表中 我无法找出其中存在的每个作业实际导入了哪些表 因为为这些导入指定的名称不清楚且不相关 有什么方法可以找出导入实际
  • 在 alpine linux 上执行 mongodb 二进制文件

    我正在尝试在 Alpine 64 位 Linux 中为 docker 容器运行二进制 mongodb 但运行命令时 mongodb出现以下错误 bash 4 3 mongod bash mongod No such file or dire
  • 我应该使用 Jenkins 重量级执行器还是蝇量级执行器来发送通知?

    我的 Jenkins 管道中有几个步骤可以通知用户 在我的例子中使用 Slack 集成 在 a 中编写通知代码是一个好习惯吗node阻止使用重量级执行器还是将其留在外面以使用蝇量级执行器 根据文档 https github com jenk
  • Postgres:当出现错误时如何执行 Sum 查询?

    我正在使用 sum 函数来查找总数 但出现错误 这是查询 select sum col1 from table name where col2 abc Error function sum text does not exist Hint
  • 如何将 NSMutableArray 传递给另一个 ViewController 类

    我已经创建了 NSMutale 数组 英雄列表视图控制器 我想在另一个 viewController 中使用它地图教程视图控制器 我这样尝试过 在 HeroListViewController h 中 MapTutorialViewCont
  • 如何加快gradle中tomcat的启动过程?

    尝试使用此 gradle 代码片段启动 tomcat task startTomcat type Exec workingDir tomcat home bin commandLine cmd c startup bat 运行此任务后 to
  • Connect-mongo 会话不会自动删除

    我有一个使用 NodeJS Express MongoDB 和 connect mongo 的应用程序 我的问题是 会话过期时似乎不会自动从 MongoDB 中删除 因此数据库大小会不断增长 直到磁盘已满 connect mongo 的开发
  • 免注册 COM 互操作和相关程序集

    我们正在致力于将基于 MFC 的大型应用程序与少数托管 NET 加载项集成 与这些加载项的通信是通过 COM 完成的 从历史上看 我们只是使用注册表来使这些加载项 作为 COM 服务器 可供应用程序使用 但是 现在我们尝试使用免注册 COM
  • 如何在Python中使用wand优化图像大小

    我想使用魔杖调整和优化 png 和 jpg 图像大小 使用 PIL 如果我指定优化选项 我可以保存大约三分之一大小的相同图像 with open filename rb as f pimage PImage open f resized p
  • 表单认证滑动过期不起作用

    我有下面的代码 int intTimeout FormsAuthentication Timeout Hours 60 FormsAuthentication Timeout Minutes var authTicket new Forms
  • Terraform 错误:锁定状态时出错:获取状态锁时出错:发生 2 个错误:

    我尝试了 terraform 版本 v0 12 26 和 v0 13 3 两者都失败了 地形计划 获取状态锁 这可能需要一些时间 错误 锁定状态时出错 获取状态锁时出错 发生 2 个错误 ResourceNotFoundException
  • 初始化期间无法成功更新网络信息

    当我当天第一次启动该应用程序时 我总是遇到上述问题 当我第一次启动应用程序时 我会调用服务器来获取一些数据 然后播放动画视频 服务器调用位于与主 UI 线程不同的线程中 这与网络可达性或动画视频有关吗 我认为第一部分是主要问题 但不能一直重
  • 串口通讯显示

    我正在尝试通过串行端口通信进行聊天 这个聊天必须在 WPF 项目中有一个界面 我已经制作了界面和所有内容 我陷入了通过串口接收响应的困境 我已经尝试从串行端口添加 DataReceived 事件 但我担心我使用错误 因为我以前从未用 C 编