串口未接收到任何数据

2023-12-22

我正在开发需要与 COM 端口交互的程序。

通过本次问答了解到:.NET SerialPort DataReceived 事件未触发 https://stackoverflow.com/questions/2281618/net-serialport-datareceived-event-not-firing,我的代码就是这样的。

namespace ConsoleApplication1
{
 class Program
 {
    static SerialPort ComPort;        

    public static void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args)
    {
        string data = ComPort.ReadExisting();
        Console.Write(data.Replace("\r", "\n"));
    }

    static void Main(string[] args)
    {
        string port = "COM4";
        int baud = 9600;
        if (args.Length >= 1)
        {
            port = args[0];
        }
        if (args.Length >= 2)
        {
            baud = int.Parse(args[1]);
        }

        InitializeComPort(port, baud);

        string text;
        do
        {
            String[] mystring = System.IO.Ports.SerialPort.GetPortNames();

            text = Console.ReadLine();
            int STX = 0x2;
            int ETX = 0x3;
            ComPort.Write(Char.ConvertFromUtf32(STX) + text + Char.ConvertFromUtf32(ETX));
        } while (text.ToLower() != "q");
    }

    private static void InitializeComPort(string port, int baud)
    {
        ComPort = new SerialPort(port, baud);
        ComPort.PortName = port;
        ComPort.BaudRate = baud;
        ComPort.Parity = Parity.None;
        ComPort.StopBits = StopBits.One;
        ComPort.DataBits = 8;
        ComPort.ReceivedBytesThreshold = 9;
        ComPort.RtsEnable = true;
        ComPort.DtrEnable = true;
        ComPort.Handshake = System.IO.Ports.Handshake.XOnXOff;
        ComPort.DataReceived += OnSerialDataReceived;            
        OpenPort(ComPort);            
    }

    public static void OpenPort(SerialPort ComPort)
    {   
        try
        {   
            if (!ComPort.IsOpen)
            {
                ComPort.Open();                    
            }
        }
        catch (Exception e)
        {
            throw e;
        }
    }
}
}

我的问题是 DataReceived 事件永远不会被触发。

我的程序规范是:

  1. 只需 .net 控制台编程
  2. 我使用 VSPEhttp://www.eterlogic.com http://www.eterlogic.com
  3. 我的电脑已经有 COM1 和 COM2 端口。
  4. 我使用 VAPE 创建了 COM2 和 COM4。
  5. 我从字符串数组(COM1、COM2、COM3、COM4)获取输出结果

但我还是不知道为什么DataReceived事件没有被触发。


Updated

不幸的是,我还是没能开火DataReceived以任何方式发生的事件。

所以,我创建了一个新项目,希望我能找到解决的方法。

在那个新项目[只是控制台应用程序]中,我创建了一个类......

public class MyTest
{
    public SerialPort SPCOM4;

    public MyTest()
    {

        SPCOM4 = new SerialPort();
        if(this.SerialPortOpen(SPCOM4, "4"))
        {
            this.SendToPort(SPCOM4, "com test...");
        }

    }

    private bool SerialPortOpen(System.IO.Ports.SerialPort objCom, string portName)
    {
        bool blnOpenStatus = false;
        try
        {
            objCom.PortName = "COM" + portName;
            objCom.BaudRate = 9600;
            objCom.DataBits = 8;

            int SerParity = 2;
            int SerStop = 0;

            switch (SerParity)
            {
                case 0:
                    objCom.Parity = System.IO.Ports.Parity.Even;
                    break;
                case 1:
                    objCom.Parity = System.IO.Ports.Parity.Odd;
                    break;
                case 2:
                    objCom.Parity = System.IO.Ports.Parity.None;
                    break;
                case 3:
                    objCom.Parity = System.IO.Ports.Parity.Mark;
                    break;
            }

            switch (SerStop)
            {
                case 0:
                    objCom.StopBits = System.IO.Ports.StopBits.One;
                    break;
                case 1:
                    objCom.StopBits = System.IO.Ports.StopBits.Two;
                    break;
            }

            objCom.RtsEnable = false;
            objCom.DtrEnable = false;
            objCom.Handshake = System.IO.Ports.Handshake.XOnXOff;
            objCom.Open();
            blnOpenStatus = true;

        }
        catch (Exception ex)
        {
            throw ex;
        }
        return blnOpenStatus;
    }

    private bool SendToPort(System.IO.Ports.SerialPort objCom, string strText)
    {
        try
        {
            int STX = 0x2;
            int ETX = 0x3;

            if (objCom.IsOpen && strText != "")
            {
                objCom.Write(Char.ConvertFromUtf32(STX) + strText + Char.ConvertFromUtf32(ETX));
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return true;
    }
}

我不确定我会面临好运还是坏运,因为这个新班级可能会着火DataReceived来自仍在运行的旧控制台应用程序的事件。对我来说这真是个奇迹,我不知道这是怎么发生的。

让我告诉你更多细节,以便你可以给我更好的建议。

  1. 最后我创建了 2 个控制台项目。
  2. 第一个项目是我昨天作为问题发布的课程。
  3. 第二个项目是名为 MyTest 的类,它可以着火DataReceived来自第一个项目的事件,同时两个项目正在运行。

谁能给我建议如何将这两个项目合并为一个项目?


    ComPort.Handshake = Handshake.None;

问题不在于 DataReceived 事件未触发,问题在于串行端口未接收任何数据。很少有串行设备根本不使用握手。如果将其设置为“无”,则驱动程序将不会打开 DTR(数据终端就绪)和 RTS(请求发送)信号。串行端口设备将其解释为“机器已关闭(DTR)”或“机器未准备好接收数据(RTS)”。因此它不会发送任何内容,并且您的 DataReceived 事件也不会触发。

If you really如果想要 None,则将 DTREnable 和 RTSEnable 属性设置为 true。但您可能需要 HandShake.RequestToSend,因为设备似乎正在关注握手信号。

如果仍然遇到问题,请使用其他串行端口程序(例如 Putty 或超级终端)来确保连接和通信参数良好并且设备响应良好。 SysInternals 的 PortMon 实用程序提供了驱动程序交互的低级视图,以便您可以比较好与坏。

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

串口未接收到任何数据 的相关文章

随机推荐

  • 使用 CakePHP Auth 时出现未定义方法 stdClass::user() 错误

    我对 CakePHP 相当陌生 正在使用 Auth 组件构建一个网站 有几次我尝试用这个组件做一些导致错误的事情 Fatal error Call to undefined method stdClass user in ftphome s
  • 是否可以在 Android 上创建符号链接?

    我想知道在 android 中是否可以从我的 android 应用程序创建符号链接 因为我想使用 sdcard 创建我的应用程序的文件夹 数据的符号链接 我不是 android 方面的专家 但我通常使用 Java nio File File
  • 如何自定义QCalendarWidget?

    我正在尝试将一些样式表应用到我的QCalendarWidget 我已经做了一些改变 这是我现在的代码 QCalendarWidget QWidget background color magenta color green QCalenda
  • multinom() 默认情况下如何处理 NA 值?

    当我跑步时multinom say Y X1 X2 X3 如果对于某一特定行X1 is NA 即缺失 但是Y X2 and X3全部都有值 是否会丢弃整行 就像 SAS 中那样 如何处理缺失值multinom 这是一个简单的例子 来自 mu
  • 如何将 Docker Hub 镜像拉取到 Google Cloud Run?

    我正在尝试将 Docker 映像拉入 Google Cloud Run 我发现我可能需要先将其拉到 Google 容器注册表 但我可以以某种方式避免它吗 另外 我宁愿直接从源头获取它以使其保持最新 我查看了该项目 最后在 Cloud Run
  • Java 对象、更改字段侦听器、设计模式

    有一个类 public class MyClass private String field1 private String field2 private String field3 getters setters 然后我们更新一些字段 M
  • 尽管 flex-basis: 0 [重复],Flexbox 项目的宽度并不相等

    这个问题在这里已经有答案了 我在 Flexbox 中有 4 列 我希望它们的宽度相等 那个有overflow hidden比其他人占据更多的位置 而我无法修复它 在我看来 我遇到了与这篇文章中所述相同的问题 Flexbox 和溢出隐藏无法正
  • 使用“从浏览器中单击”按钮打开客户端的桌面应用程序 - Python/HTML [重复]

    这个问题在这里已经有答案了 我想打开桌面应用程序 例如 记事本 Powerpoint Putty 附上它在共享点上如何工作的图像 随附的示例图像显示了如何通过单击按钮打开 Microsoft Teams 我需要这个精确的复制品 单击 打开
  • Visual Studio 2015 调试并继续

    我们将环境从 Visual Studio 2008 更改为 2015 更新 1 现在我们遇到了一些奇怪的调试行为 当我们遇到断点并更改一些代码并继续时 我们无法再在快速监视或立即窗口中看到某些类型的变量内容 例如数据表 图像 A type
  • 如何测试 PHP 程序? [复制]

    这个问题在这里已经有答案了 有没有办法测试程序代码 我一直在研究 PHPUnit 它似乎是创建自动化测试的好方法 然而 它似乎是面向面向对象的代码 是否有过程代码的替代方案 或者我应该在尝试测试网站之前将网站转换为面向对象 这可能需要一段时
  • System.Text.Json 将字典序列化为数组

    是否可以使用 System Text Json 将字典序列化 和反序列化 为数组 代替 hello world 我需要将我的字典序列化为 key hello value world 最好不必在我的类的字典属性上设置属性 使用 newtons
  • 在Python中的图像中的表格上创建边框

    我有一个图像 其中有一个表格和一些其他数据 我需要为表格绘制边框以分隔每个单元格 My image looks like this What i am trying 1 dilating the image to create contin
  • java读取上传文件的内容

    我知道如何上传文件
  • 如何拦截自定义 HTTP 标头值并将其存储在 Wicket 的 WebSession 中?

    我需要从每个请求中获取特定的自定义 HTTP 标头值并将其放入 WebSession 中 以便以后可以在任何网页上使用它 我相信 Wicket 的方法是使用一个自定义类来扩展具有适当访问器的 WebSession 我的问题是 我需要什么样的
  • Iphone SDK,从 UIImage 创建视频

    我需要根据所选图像创建视频 我有代码它应该可以工作 但在附加缓冲区时给出错误 这就是两种类型图像的保存方式 void imagePickerController UIImagePickerController picker didFinis
  • 多个控制器和指令之间的通信

    我有一个支持 HTML5 Canvas 可视化的指令 该指令具有多种方法来修改可视化的不同部分 问题是具有不同父 子 兄弟关系的多个控制器需要与该指令进行通信 现在我已经将这种非常糟糕的方式连接起来 将事件发送到指令的父控制器 然后将它们广
  • Magento 1.7:在 2 列模板中以全宽显示类别页面上的类别图像

    无法找到运行 Magento 1 7 时此问题的解决方案 上面主栏中显示的类别 我想将其显示在两列上方的页面宽度上 这是一个例子 http www vimodos nl schoenen art sex 92 http www vimodo
  • 在struts 2中调用带参数的方法?

    我在 struts 2 动作类中给出了下面的方法 public String add String boo codes here 我想调用add方法 还有我的struts xml
  • 如何在 PHP 中对数字进行四舍五入

    我经营一个 woocommerce 网站 重量以磅为单位 我需要将它们转换为公斤 我从网站下载了这个脚本 它完成了这项工作 但它设置了带有很多小数的新权重 不知道如何四舍五入 我试图使用round new weight 2 但它没有接受或不
  • 串口未接收到任何数据

    我正在开发需要与 COM 端口交互的程序 通过本次问答了解到 NET SerialPort DataReceived 事件未触发 https stackoverflow com questions 2281618 net serialpor