c# - 引入多线程后串口通信出现蓝屏错误

标签 c# multithreading error-handling out-of-memory

我开发了一个应用程序,其中我每隔 5 秒轮询一次串行端口(发送请求并获取响应)。一切都工作得很好,我彻底测试了它。

但是当我引入线程时,我得到了有关物理内存的蓝屏错误或线程中下面附加的内容,我只是将 GUI 更新任务和轮询任务分开。

任何人都可以建议我应该做什么来删除相同的内容,只是卡住并且不知道该怎么做。

每次运行应用程序时都会发生这种情况,我使用的是专业驱动程序串口转 USB 驱动程序。

主要应用代码

private void timer_Elapsed(object sender, ElapsedEventArgs e)
 {
PollingAllMeters();         
 }


 public void PollingAllMeters()
    {
        int isdbError = 0;
        PollingUtility.MeterClass mData = new PollingUtility.MeterClass();



        for (int index = 0; index < m_slaveID.Length; index++)
        {
            try
            {
                mData = poll.MeterOne(m_slaveID[index]);
                Thread processData = new Thread(() => this.updateData(data));
                processData.Start();
            }
            catch { MessageBox.Show("Inside polling box"); 
         }
      }


    private void updateData(MeterValues data)
    {

        mainFormRef.updateData(data);

    }

发生实际请求和响应的 DLL 代码

enter code here
public MeterClass MeterOne(byte meterID)
    {
        MeterClass data1 = new MeterClass();
                 //Voltage
        mb.SendFc3(meterID, startAdd, register, ref value_meter); //modbus call is made here for         sending and receiving response at serial port
        if (mb.modbusStatus == "Read successful")
        { 
             //do some calculation
        }
        else
        {
            // error handling code to create log file

            if (mb.modbusStatus == "Error in read event")
            {
                isPollError = 21;
            }
            else if (mb.modbusStatus == "CRC error")
            {
                isPollError = 22;
            }
            else if (mb.modbusStatus == "Serial port not open")
            {
                isPollError = 23;
            }
        }


        startAdd = 360;
        register = 2;

        value_meter = new byte[register * 2];
        meterData = new byte[register * 2];

        //Max demand
        mb.SendFc3(meterID, startAdd, register, ref value_meter);
        if (mb.modbusStatus == "Read successful")
        {
            //do some calculation

        }
        else
        {
            // error handling code to create log file

            if (mb.modbusStatus == "Error in read event")
            {
                isPollError = 21;
            }
            else if (mb.modbusStatus == "CRC error")
            {
                isPollError = 22;
            }
            else if (mb.modbusStatus == "Serial port not open")
            {
                isPollError = 23;
            }
        }


        startAdd = 496;
        register = 16;

        value_meter = new byte[register * 2];
        meterData = new byte[register * 2];

        mb.SendFc3(meterID, startAdd, register, ref value_meter);
        if (mb.modbusStatus == "Read successful")
        {
          //do some calcualtion

        }
        else
        {
            // error handling code to create log file

            if (mb.modbusStatus == "Error in read event")
            {
                isPollError = 21;
            }
            else if (mb.modbusStatus == "CRC error")
            {
                isPollError = 22;
            }
            else if (mb.modbusStatus == "Serial port not open")
            {
                isPollError = 23;
            }
        }

        data1.date = DateTime.Now;
        data1.Status = isPollError;
        return data1;      // return result to the main program

    }

最佳答案

模拟串行端口的 USB 和蓝牙设备驱动程序是出了名的不可靠。我想,这是一个残酷的行业,没有足够的钱来支付优秀程序员体面的工资。如果您无法获得驱动程序更新,您唯一能做的就是销毁它,这样它就不再让您的生活变得痛苦。把它带到 parking 场,用你的车碾过它几次。

在启动引擎之前,请仔细查看您的代码。 “多线程”是一个危险信号,驱动程序不会注意到您的程序使用多个线程。避免出现可以从多个线程同时调用 Read 或 Write 的情况。驾驶员应该始终对此保持弹性,但这并不经常受到考验。如有必要,重新调整代码,以便只有单个线程读取或写入或使用lock语句。

关于c# - 引入多线程后串口通信出现蓝屏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902448/

相关文章:

multithreading - Delphi队列和同步

Java 线程 - 这是同步的正确使用吗

C# 按字母顺序排序字符串,后跟出现频率

java - 关闭钩子(Hook)可以依赖另一个线程吗?

c# - 如何将列标题文本左对齐 Datagridview Windows 窗体 C#

.net - 处理与.NET Web服务内的客户端的连接断开-可能吗?

asp.net-mvc-2 - 自定义错误页面不显示

javascript - Firebug 没有显示错误的堆栈跟踪?

c# - NHibernate 手动控制抓取

c# - 如何设置以编程方式创建的 xlsx 文件中单元格的宽度?