gpt4 book ai didi

c# - 更改 system.io.port datareceived 事件输出类型

转载 作者:行者123 更新时间:2023-11-30 18:50:13 25 4
gpt4 key购买 nike

我正在为 modbus 和串行连接构建一个类库,我需要返回一个字节数组,但是当使用来自 System.IO.Ports 的 DataReceived 事件时,我不能返回任何,因为它的类型是无效的。另外,我注意到 DataReceived 没有触发。以下是我的代码:

        public void ConnectSerialModBus_Loopback(string COM, int baud, int meter_address, int function, int Code_HighByte, int Code_LowByte, int data_high_byte, int data_low_byte)
{
SerialPort port = new SerialPort(COM, baud);
try
{

if (!(port.IsOpen))
{
byte[] sendPacket = BuildPacket(meter_address, function, Code_HighByte, Code_LowByte, data_high_byte, data_low_byte);
double dataBytes = 2.0;

port.Open();
port.RtsEnable = false;//rts = high
port.Handshake = Handshake.None;
//SEND PACKET TO DEVICE
port.Write(sendPacket, 0, sendPacket.Length);

#region RECEIVE DATA FROM SERIAL
//MAKE DELAY TO SEND
Thread.Sleep(10);

port.RtsEnable = true;
//MAKE DELAY TO RECEIVE
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
//Thread.Sleep(CalculateDelay(dataBytes)+90);

port.Close();
port.Dispose();
#endregion

}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (port != null)
{
if (port.IsOpen)
{
port.Close();
}
port.Dispose();
}
}
}

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] readingbyte = new byte[port.BytesToRead];
if (port.BytesToRead > 0)
{
port.Read(readingbyte, 0, readingbyte.Length);
}
}

我想以某种方式返回从 port_DataReceivedConnectSerialModBus_Loopback 接收到的字节,而且 DataReceived 没有触发。请帮助这非常紧急

最佳答案

DataReceived 未触发

DataReceived 未触发,因为您调用了 port.Close()在附加处理程序之后和 SerialPort 的接收线程有机会运行之前立即执行。

返回一个字节数组 - 简单答案

在您提供的简单代码示例中,您可以创建私有(private) Byte[]成员并分配 readingbyte从你的内部反对它 port_DataReceived事件处理程序。

返回一个字节数组 - OO 提示答案

但是,在更稳健的应用程序中,您应该考虑创建一个封装 Modbus ADU 协议(protocol)部分的事务类,处理客户端请求的传输和服务器响应的(第 2 层)处理。

除了 ADU 层之外,您还可以将 PDU 层分离到一个抽象的 ModbusFunction 基类中,该基类为 ADU 类提供接口(interface)以获取请求字节并返回响应字节。然后,您希望客户端使用的每个 modbus 功能都将在派生自 PDU 基类的自己的类中实现。

这样,当您需要与服务器交互时,您创建一个 PDU 函数类的实例,使用适当的参数来形成正确的 PDU 数据包,并将其传递给处理请求/重试/响应逻辑并将返回的数据传递回 PDU 对象以进行适当的解析。

向 PDU 基类添加事件将允许代码的其他部分附加到 PDU 类的事件,并在函数成功完成时接收通知。

对于具有多个可寻址属性的服务器,通过 Modbus 函数实现,您将为每个属性(或连续寄存器的集合)创建适当的 Modbus 函数类的实例,并附加到事件,每当对象引发其更新事件时更新您的模型和/或 UI。如果您想手动查询服务器,则 Hook UI 命令以将 Properties Modbus 函数对象传递给事务对象,或者如果您希望定期轮询属性,则实现一个计时器线程按计划执行此操作。

关于c# - 更改 system.io.port datareceived 事件输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3933675/

25 4 0
文章推荐: javascript - 以触​​发任何更改处理程序的方式使用 jQuery 选择