device uart

main
esea_info 2 years ago
parent feaa3ae516
commit c9035a427e
  1. 5
      myOscar.py
  2. 159
      yiwinframe.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:

@ -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()

Loading…
Cancel
Save