python 周立功二次开发,收发message,检测信号值
·
基于调用ZLG自带的dll库文件和ZLG.PY中定义的接口函数,二次开发,收、发message,检测和判定信号值
def Send_CAN_Data(self, FrameNum, ExtendFrame, RemoteFrame, ID, dlc, Data, chn_handle):
transmit_num = FrameNum
msgs = (ZCAN_Transmit_Data * transmit_num)()
for i in range(transmit_num):
msgs[i].transmit_type = 0 # 0-正常发送,2-自发自收
msgs[i].frame.eff = ExtendFrame # 0-标准帧,1-扩展帧
msgs[i].frame.rtr = RemoteFrame # 0-数据帧,1-远程帧
msgs[i].frame.can_id = ID
msgs[i].frame.can_dlc = dlc
for j in range(msgs[i].frame.can_dlc):
msgs[i].frame.data[j] = Data[j]
ret = zcanlib.Transmit(chn_handle, msgs, transmit_num)
print("Tranmit Num: %d." % ret)
def Receive_Can_Message(self, ID, DataBuffer, chn_handle):
JudgeFlag = 0
while True:
ReceiveDataStr = ''
rcv_num = zcanlib.GetReceiveNum(chn_handle, ZCAN_TYPE_CAN) # 接收can信号
rcv_canfd_num = zcanlib.GetReceiveNum(chn_handle, ZCAN_TYPE_CANFD) # 接收fdcan信号
if JudgeFlag == 1:
break
elif rcv_num: # 接收到了can信号
print("Receive CAN message number:%d" % rcv_num)
rcv_msg, rcv_num = zcanlib.Receive(chn_handle, rcv_num)
for i in range(rcv_num): # 下面的几个参数是can报文中的参数,不多解释
if rcv_msg[i].frame.can_id == ID:
print(rcv_msg[i].frame.can_dlc)
for j in range(rcv_msg[i].frame.can_dlc):
DataBuffer.append(hex(rcv_msg[i].frame.data[j]))
ReceiveDataStr = ReceiveDataStr + ' ' + hex(rcv_msg[i].frame.data[j])
print('data len is %x' % len(DataBuffer))
JudgeFlag = 1
DataBuffer = []
print("data:%s" % ReceiveDataStr) # hex是查看16进制的报文
print("JudgeFlag is %d" % JudgeFlag)
elif rcv_canfd_num: # 接收到了fdcan信号
print("Receive CANFD message number:%d" % rcv_canfd_num)
rcv_canfd_msgs, rcv_canfd_num = zcanlib.ReceiveFD(chn_handle, rcv_canfd_num)
for i in range(rcv_canfd_num):
if rcv_msg[i].frame.can_id == ID:
for j in range(rcv_msg[i].frame.can_dlc):
DataBuffer[j] = hex(rcv_msg[i].frame.data[j])
ReceiveDataStr = ReceiveDataStr + ' ' + hex(rcv_msg[i].frame.data[j])
print('data len is %x' % len(DataBuffer))
DataBuffer = []
JudgeFlag = 1
print("data:%s" % ReceiveDataStr) # hex是查看16进制的报文
print("JudgeFlag is %d" % JudgeFlag)
else:
print("no msg")
time.sleep(0.1)
# ZLG_judage singnal value_Try by Jingyao
def CheckSiganlValue(self, chn_handle,SignalName, MessageID, CrossByte, Length, StartBit, StopBit, CheckValue):
DataBuffer = []
if CrossByte == False:
BytePos = int(StartBit / 8)
offset = StartBit - 8 * BytePos
if Length == 1:
self.Receive_Can_Message(MessageID, DataBuffer, chn_handle)
hex_integer=int(DataBuffer[BytePos],0)
ActualValue = (hex_integer & ((0xFF >> 7) << offset))>>offset
# ActualValue = (hex(DataBuffer[BytePos]) & ((0xFF >> 7) << offset))
if ActualValue == CheckValue:
print("Signal %s value is right %d" %(SignalName,ActualValue))
return True
else:
print("Signal %s value is right %d" %(SignalName,ActualValue))
return False
elif Length != 1:
self.Receive_Can_Message(MessageID, DataBuffer, chn_handle)
print(DataBuffer[BytePos])
hex_integer = int(DataBuffer[BytePos], 0)#将16进制的字符串转换为十进制整数
ActualValue = (hex_integer & ((0xFF >> (8 - (StopBit - StartBit + 1))) << offset))>>offset
# ActualValue = (DataBuffer[BytePos] & ((0xFF >> (8-(StopBit-StartBit+1))) << offset))
if ActualValue == CheckValue:
print("Signal %s value is right %d" %(SignalName, ActualValue))
return True
else:
print("Signal %s value is wrong %d" %(SignalName, ActualValue))
return False
elif CrossByte == True:
if (Length<=8):
BytePos1=int(StopBit/8)
BytePos2 = int(StartBit/8)
offset1=8-((StopBit%8)+1)
if StartBit%8==0:
offset2=0
else:
offset2=StartBit%8
self.Receive_Can_Message(MessageID, DataBuffer, chn_handle)
hex_integer1 = int(DataBuffer[BytePos1], 0)#将16进制的字符串转换为十进制整数
hex_integer2 = int(DataBuffer[BytePos2], 0)#将16进制的字符串转换为十进制整数
# ActualValue1 = (DataBuffer[BytePos1] & (0xFF >> offset1) << offset1) >> offset1
# ActualValue2 = (DataBuffer[BytePos2] & (0xFF >> offset2)) >> (StartBit % 8)
ActualValue1 = hex_integer1 & (0xFF >> offset1)
print(ActualValue1)
ActualValue2 = hex_integer2 & ((0xFF >> offset2)<<offset2)
print(ActualValue2)
ActualValue=ActualValue2^ActualValue1
if ActualValue == CheckValue:
print("Signal %s value is right %d" % (SignalName, ActualValue))
return True
else:
print("Signal %s value is wrong %d" % (SignalName, ActualValue))
return False
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)