c# - 如何在 C# 中使用 SerialPort 端口对象的 dataReceived 事件?

标签 c# serial-port

我正在尝试创建一个小型应用程序来收集从连接到 COM10 的外部传感器接收到的数据。我已经成功创建了一个小型 C# 控制台对象和应用程序,它打开端口并使用 for 循环将数据流式传输到文件一段固定的时间。

我想将此应用程序转换为使用 dataReceived 事件来进行流式传输。看完Top 5 SerialPort Tips ,我似乎仍然无法让它发挥作用,也不知道我错过了什么。我重写了控制台应用程序,以便所有代码都在 Main 中并粘贴在下面。谁能帮我解释为什么即使我知道硬件正在向端口发送数据,事件处理程序 port_OnReceiveDatazz 也没有被调用?

谢谢

感谢@Gabe , @Jason Down , 和 @abatishchev对于所有的建议。我很难过,似乎无法让事件处理程序工作。也许它与设备有关。我可以忍受只在线程中读取端口并将数据直接流式传输到文件。


代码


namespace serialPortCollection
{   class Program
    {
        static void Main(string[] args)
        {
            
            const int bufSize = 2048;
            Byte[] buf = new Byte[bufSize]; //To store the received data.

            SerialPort sp = new SerialPort("COM10", 115200);
            sp.DataReceived += port_OnReceiveDatazz; // Add DataReceived Event Handler

            sp.Open();
            sp.WriteLine("$"); //Command to start Data Stream

            // Wait for data or user input to continue.
            Console.ReadLine();
           
            sp.WriteLine("!"); //Stop Data Stream Command
            sp.Close();
        }
        
       // My Event Handler Method
        private static void port_OnReceiveDatazz(object sender, 
                                   SerialDataReceivedEventArgs e)
        {
            SerialPort spL = (SerialPort) sender;
            const int bufSize = 12;
            Byte[] buf = new Byte[bufSize];
            Console.WriteLine("DATA RECEIVED!");
            Console.WriteLine(spL.Read(buf, 0, bufSize));
        }
    }
}

最佳答案

我认为你的问题是这条线:**

sp.DataReceived += port_OnReceiveDatazz;

不应该是:

sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);

**没关系,语法很好(我最初回答这个问题时没有意识到快捷方式)。

我还看到建议您应该为串行端口打开以下选项:

sp.DtrEnable = true;    // Data-terminal-ready
sp.RtsEnable = true;    // Request-to-send

您可能还必须将握手设置为 RequestToSend(通过握手枚举)。


更新:

找到一个建议,说你应该先打开你的端口,然后分配事件处理程序。也许这是一个错误?

所以不是这个:

sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);
sp.Open();

这样做:

sp.Open();
sp.DataReceived += new SerialDataReceivedEventHandler (port_OnReceiveDatazz);

让我知道进展如何。

关于c# - 如何在 C# 中使用 SerialPort 端口对象的 dataReceived 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/466474/

相关文章:

java - Android与Arduino的蓝牙通信

serial-port - 串行端口握手。硬件和无握手之间有什么区别?

c# - 如何抑制ClickOnce-Update提示?

c# - 如何在 XAML 中复制 'float: right'?

c# - 用于 C# 代码的 Pascal 大小写或 Camel 大小写?

c# - 在 Unity 中读取串口 "COM3"。连接建立成功,但未调用 DataReceived Handler

php - 在 Windows 上使用 PHP 进行串行通信

c# - 我应该如何使用 ViewModel?

c# - 在没有数据类型的情况下从 C# 传递 SqlParameter - 性能考虑

python - 使用 PySerial/Matplotlib 的微处理器到 RS-232 实时绘图?