diff --git a/myOscar.py b/myOscar.py index 8891925..a220027 100644 --- a/myOscar.py +++ b/myOscar.py @@ -46,7 +46,6 @@ class SerialPort : self.stopbit = sp['stopbit'] pass - @dataclass class Registers : slaveaddress: int = 1 @@ -55,7 +54,7 @@ class Registers : SNAddress: int = 2840 # 10 SNLen: int = 5 WLBeginAddress: int = 2102 - count: int = 3 + count: int = 2 snBuf:bytes = b'' wavelengthBuf: bytes = b'' intensityBuf: bytes = b'' @@ -410,7 +409,7 @@ class MyOscar(object): pass def get_device_sn_from_buf(self ): - print( f" 000000 {self.oscar.register.snBuf}") + # print( f" 000000 {self.oscar.register.snBuf}") self.oscar.deviceSN = self.oscar.register.snBuf[-6:-2].decode() if self.oscar.SN == self.oscar.deviceSN: diff --git a/yiwinframe.py b/yiwinframe.py index ee5d226..23f0686 100644 --- a/yiwinframe.py +++ b/yiwinframe.py @@ -145,7 +145,7 @@ class YiwinFrame( wx.Frame ): self.uart = Uart() - # self.viper = Viper() + # self.oscar = Viper() self.dataplot = DataPlot() self.plot_pure_water() @@ -418,6 +418,7 @@ class YiwinFrame( wx.Frame ): if not self.uart.connect(): raise MyException(f" 串口不可用 ") if self.uart.IsOpen(): + self.alterStatus_0(" COM port OK.") self.uart.disconnect() self.uart_thread = Multithread() pass @@ -425,60 +426,80 @@ class YiwinFrame( wx.Frame ): def OnDeviceSN(self, e)-> None: self.__OnDeviceStop() log.info(f"OnDeviceSN: 获取device sn ", __name__, "", "") - # self.mt = Mythead() - self.oscar.set_cfg(self.syscfg) - self.oscar.set_serial() - # self.oscar.set_modbus(self.syscfg['register']['SNAddress'], self.syscfg['register']['SNLen']) - try: - self.oscar.sn_uart_thread( self.get_device_sn ) - except Exception as e: - self.alterStatus_0(e ) - self.popDialog( e ) - self.alterStatus_0(" SN 匹配一致" ) + self.alterStatus_0( "正在获取 SN....") + if self.myoscar.oscar.register is None: + raise MyException(f" 请先打开串口,再试") + + self.myoscar.oscar.rawWavelength =None + + self.uart.set_modbus( + self.myoscar.oscar.register.slaveaddress + ,self.myoscar.oscar.register.functioncode + ,self.myoscar.oscar.register.SNAddress + ,self.myoscar.oscar.register.SNLen) + self.uart_thread.remove_tasks() + self.uart_thread.add_task( self.__device_sn, args=() ) + self.uart_thread.sequently_execute_tasks() + self.myoscar.oscar.register.snBuf = self.res + self.myoscar.get_device_sn_from_buf() + self.alterStatus_0( f" SN : {self.myoscar.oscar.deviceSN} ") pass - - def get_device_sn(self,sn): - self.device_sn = sn - if self.device_sn != self.ui_sn: - log.error( f" 设备SN {self.device_sn} 与系统设置 {self.ui_sn}不一致 错误 " ) - pass - else: - log.info(" sn 匹配成功 ! ") - pass + + def __device_sn(self)-> None: + self.res =b'' + self.uart.disconnect() + self.uart.connect() + self.uart.write() + self.res = self.uart.OneMeasure() + def OnDeviceWL(self, e)-> None: self.__OnDeviceStop() log.info(f"OnDeviceWL: 获得device wavelength ... ", __name__, "", "") - if self.device_sn != '': - self.oscar.set_cfg( self.syscfg ) - self.oscar.set_serial() - try: - self.oscar.wl_uart_thread( self.get_device_wl ) - except Exception as e: - self.alterStatus_0(e ) - self.popDialog( e ) - self.alterStatus_0(" 获取波长成功!" ) - else: - self.popDialog('请获取设备序列号SN信息再试') - pass + self.alterStatus_0( "正在获取波长....") + if self.myoscar.oscar.register is None: + raise MyException(f" 请先打开串口,再试") + if not self.myoscar.devicesn_ok: + raise MyException(f"设备SN {self.myoscar.oscar.deviceSN} 与系统SN {self.myoscar.oscar.SN} 不匹配") + + self.uart_thread.remove_tasks() + + self.res = b'' + for i in range(self.myoscar.oscar.register.count): + log.debug(f" -> i {i}", __name__,"OnDeviceWL") + self.uart.set_modbus( self.myoscar.oscar.register.slaveaddress,self.myoscar.oscar.register.functioncode + ,self.myoscar.oscar.register.WLBeginAddress + i*122, 122 ) + log.debug(f" command -> {self.uart.command.hex()} ") + self.uart_thread.add_task( self.__device_wl, args=() ) + self.uart_thread.sequently_execute_tasks() + # 处理self.res, 将self.res 返回 myviper + self.myoscar.oscar.register.wavelengthBuf = self.res + self.myoscar.get_raw_wavelength_from_buf() + + def __device_wl(self, )-> None: + self.uart.disconnect() + self.uart.connect() + self.uart.write() + tmp = self.uart.OneMeasure() + self.res = self.res + tmp[3:len(tmp)-2] - def get_device_wl(self, wl_buf): - if len(wl_buf) != 0: - self.output_wavelength = wl_buf - self.output_wl_ndarray = np.array(self.output_wavelength) - else: - log.error( " 获取设备波长出错 " ) - raise MyException( " 获取设备波长出错 " ) - pass def OnDeviceLog(self, e)-> None: self.__OnDeviceStop() log.info( f"OnDeviceLog: 采集数据 定时器采集", __name__, "", "" ) - # !!!! 判断是否有波长和sn - if self.output_wavelength == []: - self.alterStatus_0( " 没有设备波长信息,请获取设备波长") - self.popDialog( " 没有设备波长信息,请获取设备波长") - raise MyException(" 没有设备波长信息,请获取设备波长") + self.alterStatus_0( "开始采集数据....") + if self.myoscar.oscar.register is None: + self.alterStatus_0( " 请先打开串口,再试") + raise MyException(f" 请先打开串口,再试") + if not self.myoscar.devicesn_ok: + self.alterStatus_0( " 设备SN 与系统不匹配") + raise MyException(f"设备SN 与系统不匹配") + if self.myoscar.oscar.rawWavelength is None: + raise MyException(f"没有波长信息") + + ## 获取纯水标定文件 + self.__read_cal_file() + self.__OnDeviceLog() # 如何整点获取,如何快速获取 @@ -486,33 +507,29 @@ class YiwinFrame( wx.Frame ): pass def __OnDeviceLog(self,)-> None: - self.alterStatus_0(" 开始采集数据....") - self.device_data = b'' - self.mt = Mythead() - self.oscar.set_cfg( self.syscfg ) - self.oscar.set_serial() - try: - self.oscar.log_uart_thread( self.get_device_data ) - except Exception as e: - print(e) - self.alterStatus_0(e ) - self.popDialog( e ) - pass + self.uart_thread.remove_tasks() + + self.res = b'' + for i in range(self.myoscar.oscar.register.count): + log.debug(f" -> i {i}", __name__,"OnDeviceWL") + self.uart.set_modbus( self.myoscar.oscar.register.slaveaddress,self.myoscar.oscar.register.functioncode + ,self.myoscar.oscar.register.DataBeginAddress + i*122, 122 ) + log.debug(f" command -> {self.uart.command.hex()} ") + self.uart_thread.add_task( self.__device_log, args=() ) + self.uart_thread.sequently_execute_tasks() + # 处理self.res, 将self.res 返回 myviper + self.myoscar.oscar.register.intensityBuf = self.res + self.myoscar.get_raw_intensity_from_buf() + + + def __device_log(self, )-> None: + # self.res =b'' + self.uart.disconnect() + self.uart.connect() + self.uart.write() + tmp = self.uart.OneMeasure() + self.res = self.res + tmp[3:len(tmp)-2] - def get_device_data( self,tm, data_buf ): - if len(data_buf) != 0: - self.device_data = self.oscar.convert_buf_2_float( data_buf ,8 ) - self.plotpanel.clear_past() - self.plotpanel.set_title_x_y( *self.plotpanel.measure_legend ) - self.plotpanel.plot_one( - tm - , self.output_wl_ndarray - ,np.array(data_buf) - ) - else: - log.error( " 采集设备数据出错 " ) - raise MyException(" 采集设备数据出错 ") - pass def OnDeviceStop(self, e)-> None: self.__OnDeviceStop()