Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET异步解析串行数据,将数据从共享函数获取到实例_Vb.net_Serial Port_Instance_Shared - Fatal编程技术网

VB.NET异步解析串行数据,将数据从共享函数获取到实例

VB.NET异步解析串行数据,将数据从共享函数获取到实例,vb.net,serial-port,instance,shared,Vb.net,Serial Port,Instance,Shared,VB.NET2010,.NET4 你好, 我已经挣扎了一段时间的逻辑,并希望有一点洞察力 我正在开发一个应用程序,用于控制一台由许多连接到计算机的设备组成的工业机器。大多数情况下,如果它是合理的直接,但我有麻烦思考的RS-232设备。RS-232设备之一是一种具有多种功能的奇特电源。现在相关的是电压读取、电压写入、电流读取和电流写入 我试图实现的设计模式是,每个连接的设备都由一个对象表示,该对象具有读/写等方法和COM端口等属性 对于这个电源,显然端口引用应该在实例之间共享,因此我有一个基类(比

VB.NET2010,.NET4

你好,

我已经挣扎了一段时间的逻辑,并希望有一点洞察力

我正在开发一个应用程序,用于控制一台由许多连接到计算机的设备组成的工业机器。大多数情况下,如果它是合理的直接,但我有麻烦思考的RS-232设备。RS-232设备之一是一种具有多种功能的奇特电源。现在相关的是电压读取、电压写入、电流读取和电流写入

我试图实现的设计模式是,每个连接的设备都由一个对象表示,该对象具有读/写等方法和COM端口等属性

对于这个电源,显然端口引用应该在实例之间共享,因此我有一个基类(比如说,PowerSupply),其受保护的共享属性端口为IO.Ports.SerialPort。然后,我有两个从这个类继承的类,PowerSupplyVoltage和PowerSupplyCurrent,它们各自定义了用于保存上次读/写值的读/写方法和属性

我的问题是使用共享SerialPort对象上的Port.dataReceived事件解析电源设备的响应。电源使用的协议指定它在每个响应数据包中发送的数据。因此,基本上,它可以说相当于“电压为100V”或“电流为1A”或“电压已设置为150V”等

我试图在一个共享函数中解析它。只有在解析过程中,我才能确定要更新哪个实例的读/写值。我无法从共享函数中访问实例的读/写值属性。我的大脑因为思考如何正确地做这件事而受伤。我能想到的最好方法是创建某种PowerSuplyCommunicationr对象,该对象将维护对PowerSuplyVoltage和PowerSuplyCurrent实例的引用以及共享端口和DataReceivedHandler函数。但这似乎有点笨拙。有没有什么好主意

提前多谢了,
Brian

我建议让共享对象导出一个事件,每当参数消息通过串行端口时就会引发该事件。然后,各种对象实例可以订阅事件,并根据需要更新自身

这种方法的一个微小变化是,共享对象提供一个“register”方法,通过该方法,实例可以提供一个委托,当消息传入时,它们希望调用共享对象。从概念上讲,这与事件非常相似,只是共享对象可以检查传入的消息,并且只调用它所指向的实例的委托

第三种变体是让对象实例支持一个或多个接口,如INotifyVoltageChanged、INotifyCurrentChanged等,并调用共享对象中的某个方法来注册它们自己


但是,在使用这些方法时,需要注意的是,如果某个单独的对象实例被放弃,共享对象可能会永远保留对它的引用。如果使用方法#3,共享对象可能持有对该对象的弱引用,而不是普通(“强”)引用。这将略微降低更新通知的处理速度,但可以避免被放弃对象永远存在的风险。当然,单独的对象实例应该实现IDisposable,并且在释放时应该取消订阅任何通知,但是除非使用弱引用,否则实际调用Dispose的命令要比使用许多其他类型的对象的命令更强。请注意,除非使用弱引用,否则终结器将一文不值。

非常感谢您的见解。我会试着接受你的建议。