C# 多串口通信的诡异问题。请大神帮我分析分析。

yinyi4120 yinyi4120 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
工控机通过多串口卡接收串口数据。
总共接收六个串口数据。其中,COM1---COM4接收数据的协议时一样的,共10个byte位。前8位为数据位,第9位为CRC校验位,第10位位停止位,FF。
而COM5---COM6接收的数据协议时一样的,共8个byte位,前6位位数据位,第7位为CRC校验位,第8位为停止位,FF。
数据接收采用事件触发形式。具体实现代码如下。

public void _serialPort_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag)
{
return;
}
try
{
string readstr = null;
int n = _serialPort.BytesToRead;
byte[] buff = new byte[n];
_serialPort.Read(buff, 0, n);
readstr = ConvertByteArrayToString(buff);
buffer_JZ.AddRange(strToToHexByte(readstr));
while ((buffer_JZ.Count >= 10) && (buffer_JZ[9] == 255))
{

if (buffer_JZ[8] != CRC_CHECK(strToToHexByte(readstr), 8))
{
buffer_JZ.RemoveAt(0);
continue;
}
buffer_JZ.CopyTo(0, binary_data_1, 0, 10);
DataReceived(sender, e, binary_data_1);
buffer_JZ.RemoveRange(0, 10);

}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

这是COM1---COM4的接收函数

void _serialPort_DataReceived_LG(object sender, SerialDataReceivedEventArgs e)
{

//禁止接收事件时直接退出
if (ReceiveEventFlag)
{
return;
}
try
{
string readstr = null;
int n = _serialPort.BytesToRead;
byte[] buff = new byte[n];
_serialPort.Read(buff, 0, n);
readstr = ConvertByteArrayToString(buff);
buffer_LG.AddRange(strToToHexByte(readstr));
while ((buffer_LG.Count >= 8) && (buffer_LG[7] == 255))
{

if (buffer_LG[6] != CRC_CHECK(strToToHexByte(readstr), 6))
{
buffer_LG.RemoveAt(0);
continue;
}
buffer_LG.CopyTo(0, binary_data_1, 0, 8);
DataReceived(sender, e, binary_data_2);
buffer_LG.RemoveRange(0, 8);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
// throw ex;
}
}

这是COM5---COM6的接收函数。
在主窗体的代码如下:

JZ_RecePort1.openPort();
JZ_RecePort2.openPort();
JZ_RecePort3.openPort();
JZ_RecePort4.openPort();
LG_RecePort1.openPort();
LG_RecePort2.openPort();

// 接收响应事件
LG_RecePort1.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(LG_RecePort1_DataReceived_LG);
LG_RecePort2.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(LG_RecePort2_DataReceived_LG);
JZ_RecePort1.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort1_DataReceived_JZ);
JZ_RecePort2.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort2_DataReceived_JZ);
JZ_RecePort3.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort3_DataReceived_JZ);
JZ_RecePort4.DataReceived += new Port_Opera.SerialPortDataReceiveEventArgs(JZ_RecePort4_DataReceived_JZ);


接收响应

public void JZ_RecePort1_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
//判断数据来自哪片CPU
if ((bits[0] & 0x01) == 0)
{
db_opera.Save_CPU_data(bits, "Table_CPU1_1", Rece_DataSet);
}
else
{
db_opera.Save_CPU_data(bits, "Table_CPU1_2", Rece_DataSet);
}
}
public void JZ_RecePort3_DataReceived_JZ(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
if ((bits[0] & 0x01) == 0)
{
db_opera.Save_CPU_data(bits, "Table_CPU3_1", Rece_DataSet);

}
else
{
db_opera.Save_CPU_data(bits, "Table_CPU3_2", Rece_DataSet);
}
}
public void LG_RecePort1_DataReceived_LG(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
if ((bits[0] & 0x01) == 0)
{
db_opera.Save_LG_data(bits, "Table_LG1_1", Rece_DataSet);

}
else
{
db_opera.Save_LG_data(bits, "Table_LG1_2", Rece_DataSet);
}
}
public void LG_RecePort2_DataReceived_LG(object sender, SerialDataReceivedEventArgs e, byte[] bits)
{
if ((bits[0] & 0x01) == 0)
{
db_opera.Save_LG_data(bits, "Table_LG2_1", Rece_DataSet);
}
else
{
db_opera.Save_LG_data(bits, "Table_LG2_2", Rece_DataSet);
}
} // 串口COM1---COM6接收数据

现在的问题是,COM1---COM4能正确接收数据,而COM5---COM6的事件无法触发,或者有时候接收到COM5,或者COM6,反正COM5与COM6数据不能同时接收上来。
且有时候接收COM1---COM4的函数会接收到COM5---COM6的数据。
求大神帮我看看。感激不尽。



...全文

相关推荐

Friendship-is-Eldritch

Friendship-is-Eldritch

男爵兔

C#实战:用VS2022从零开发串口调试助手全流程

上位机开发中,串口通信是与嵌入式设备、仪器仪表交互的基础。理解串口的数据帧收发、字节编码和线程模型,是构建稳定调试工具的前提。C#作为Windows平台主流的开发语言,其SerialPort类封装了底层Win32 API,大幅降低了串口编程门槛,但实际项目中仍要处理跨线程UI更新、ASCII与Hex格式转换、粘包拆包等难题。掌握这些技术不仅能提升设备调试效率,还能为工业自动化、物联网网关等场景提供可靠保障。基于VS2022和WinForms,通过合理的控件布局与防御性编程,可以打造出一款界面专业、功能贴合的

小红帽的灰灰狼

论文复现基于变频与移相协同控制的全桥LLC变换器模式切换平滑性优化(Simulink仿真实现)

内容概要:本文针对“基于变频与移相协同控制的全桥LLC变换器模式切换平滑性优化”这一主题,开展Simulink仿真实现与技术复现研究。通过构建全桥LLC谐振变换器的详细仿真模型,深入探讨在不同负载工况(如轻载、重载、待机与运行模式切换)下,如何结合变频控制(FM)与移相控制(PSM)的协同策略,优化系统动态响应的平稳性与效率。研究重点在于设计合理的控制逻辑,解决模式切换过程中可能出现的电压电流冲击问题,提升系统的稳定性和电能质量。文中系统阐述了控制策略的设计原理、关键参数的整定方法,并通过仿真结果验证了该协同控制方案在抑制瞬态扰动、实现无缝切换方面的有效性,完整复现了高水平学术论文中的核心技术路线,为电力电子变换器的先进控制提供了可复现的实践范例。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事开关电源、新能源变流器开发的工程师,尤其适合具备一定Simulink仿真经验与电力电子拓扑分析能力的专业人士; 使用场景及目标:①深入理解全桥LLC变换器在多模式运行下的变频与移相协同控制机理;②掌握在Simulink中对复杂谐振变换器进行建模、控制算法实现与仿真验证的全流程方法;③为学术论文写作、科研项目申报或高性能电源产品的工程开发提供可靠的技术参考与仿真基础; 阅读建议:建议结合所提供的Simulink模型文件与技术文档进行同步实践,重点关注变频与移相控制的切换逻辑、参数配合关系及过渡过程的动态特性,可通过调整负载条件观察系统的响应变化,以深化对模式切换平滑性实现机制的理解。

大龙不吃小鱼干

高校技术转移办公室人员如何高效完成科技成果全周期管理?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

可视化原型素材ppt格式

可视化原型素材ppt格式

clhqianqi
评论 8
收藏 已收藏
分享
返回顶部
yinyi4120
C# 111,128 成员 642,537 内容