我开发了一个应用程序,其中我每隔 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/