赞
踩
- import sys
- print("----------------欢迎使用CAN报文转换工具交互模式----------------")
- print("请输入CAN信号,格式为:startBit:length:minValue:maxValue:setValue")
- print("例如:32:1:0:1:1")
- print("或者省略minValue和maxValue:35:1:::1")
- print("信号输入结束请再按一次回车")
-
- #十进制转换成二进制list
- def octToBin(octNum, bit):
- while(octNum != 0):
- bit.append(octNum%2)
- octNum = int(octNum/2)
- for i in range(64-len(bit)):
- bit.append(0)
-
- sig = []
- startBit = []
- length = []
- setValue = []
- #输入CAN信号
- while True:
- input_str = input()
- if not len(input_str):
- break
- if(input_str.count(":")<4):
- print("输入格式错误,参数缺少setValue,请重新输入!")
- continue
- if(input_str.split(":")[4]==""):
- print("setValue参数不能为空,请重新输入!")
- continue
- sig.append(input_str)
- #解析CAN信号
- for i in range(len(sig)):
- startBit.append(int(sig[i].split(":")[0]))
- length.append(int(sig[i].split(":")[1]))
- setValue.append(int(sig[i].split(":")[4]))
- #CAN数组存放CAN报文值
- CAN = []
- for i in range(64):
- CAN.append(-1)
- for i in range(len(startBit)):
- #长度超过1Byte的情况,暂不支持
- if(length[i]>16):
- print("CAN信号长度超过2Byte,暂不支持!!!")
- sys.stdin.readline()
- sys.exit()
- #长度未超过1Byte的情况且未跨字节的信号
- if((startBit[i]%8 + length[i])<=8):
- for j in range(length[i]):
- bit = []
- #setValue的二进制值按字节位从低到高填
- octToBin(setValue[i],bit)
- #填满字节长度值
- if(CAN[startBit[i]+j]==-1):
- CAN[startBit[i]+j] = bit[j]
- #字节存在冲突
- else:
- print(sig[i] + "字节位存在冲突,生成CAN报文失败!!!")
- sys.stdin.readline()
- sys.exit()
- #跨字节的信号
- else:
- #高位位数和低位位数
- highLen = 8 - startBit[i]%8
- lowLen = length[i] - highLen
- bit = []
- #setValue的二进制值按字节位从低到高填
- octToBin(setValue[i],bit)
- #先填进信号的高位
- for j1 in range(highLen):
- if(CAN[startBit[i]+j1]==-1):
- CAN[startBit[i]+j1] = bit[j1]
- #字节存在冲突
- else:
- print(sig[i] + "字节位存在冲突,生成CAN报文失败!!!")
- sys.stdin.readline()
- sys.exit()
- #再填进信号的低位
- for j2 in range(lowLen):
- if(CAN[(int(startBit[i]/8)-1)*8+j2]==-1):
- CAN[(int(startBit[i]/8)-1)*8+j2] = bit[highLen+j2]
- #字节存在冲突
- else:
- print(sig[i] + "字节位存在冲突,生成CAN报文失败!!!")
- sys.stdin.readline()
- sys.exit()
- #剩余位默认值设为0
- for i in range(64):
- if(CAN[i]==-1):
- CAN[i] = 0
- #----------------将二进制list每隔8位转换成十六进制输出----------------
- #其中,map()将list中的数字转成字符串,按照Motorola格式每隔8位采用了逆序
- # ''.join()将二进制list转换成二进制字符串,int()将二进制字符串转换成十进制
- #hex()再将十进制转换成十六进制,upper()转换成大写,两个lstrip()将"0X"删除,
- #zfill()填充两位,输出不换行,以空格分隔
- print(hex(int(''.join(map(str,CAN[7::-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[15:7:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[23:15:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[31:23:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[39:31:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[47:39:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[55:47:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[63:55:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
-
-

##注释 ::start #编码格式:0=Intel;1=Motorola encodeType=1 #帧格式:0=标准帧;1=扩展帧; canMode=0 #帧类型:0=数据帧;... canType=0 #默认初始值(0~1) defaultValue=0 #MSG定义 msgName=BCM_FrP01 msgID=0x2CD #长度(BYTE) msgLength=8 #signal定义 #sigName=name:startBit:length:minValue:maxValue:setValue #sigName=ReverseSw:25:6:0:1:13 #sigName=Trunk_BackDoor_Sts:33:2:0:1:2 #sigName=DRVUnlockState:37:2:0:1:3 #sigName=HeadLampLowBeam:40:8:0:1:60 #sigName=HoodStatus:51:1:0:1:0 #sigName=HeadLampHighBeam:52:1:0:1:0 #sigName=RLDoorStatus:59:1:0:1:0 #sigName=RRDoorStatus:58:1:0:1:0 #sigName=PsgDoorStatus:57:2:0:1:0 sigName=One:0:8:0:255:165 sigName=Two:24:12:0:4095:1701 sigName=Three:54:5:0:31:25 ::end ::start #编码格式:0=Intel;1=Motorola encodeType=1 #帧格式:0=标准帧;1=扩展帧; canMode=0 #帧类型:0=数据帧;... canType=0 #默认初始值(0~1) defaultValue=0 #MSG定义 msgName=BCM_FrP msgID=0x2CD #长度(BYTE) msgLength=8 #signal定义 #sigName=name:startBit:length:minValue:maxValue:setValue #sigName=ReverseSw:25:6:0:1:13 #sigName=Trunk_BackDoor_Sts:33:2:0:1:2 #sigName=DRVUnlockState:37:2:0:1:3 #sigName=HeadLampLowBeam:40:8:0:1:60 #sigName=HoodStatus:51:1:0:1:0 #sigName=HeadLampHighBeam:52:1:0:1:0 #sigName=RLDoorStatus:59:1:0:1:0 #sigName=RRDoorStatus:58:1:0:1:0 #sigName=PsgDoorStatus:57:2:0:1:0 sigName=One:35:1:0:1:1 ::end
- #!/usr/bin/python
- defaultValue = 0
- sigName = []
- startBit = []
- length = []
- minValue = []
- maxValue = []
- setValue = []
- #CAN数组存放CAN报文值
- CAN = []
- logFile = open("log.txt","w")
- def parseConfig():
- config = open("Config.txt","r")
-
- count = 0
- isError = False
- for line in config:
- line = line.strip()
- #注释
- if(line.find("#")>=0):
- continue
- #开始标记
- elif(line.find("::start")>=0):
- count = count + 1
- isError = False
- if(count>1):
- sigName.clear()
- startBit.clear()
- length.clear()
- setValue.clear()
- continue
- else:
- continue
- elif(isError == True):
- continue
- #编码格式
- elif(line.find("encodeType")>=0):
- encodeType = line.split("=")[1]
- if(encodeType != "1"):
- isError = True
- print(str(count) + ". CAN报文生成失败!!!目前仅支持Motorola编码格式,暂不支持Intel编码格式!")
- logFile.write("%d. CAN报文生成失败!!!目前仅支持Motorola编码格式,暂不支持Intel编码格式!\n" % count)
- continue
- #帧格式
- elif(line.find("canMode")>=0):
- canMode = line.split("=")[1]
- if(canMode != "0"):
- isError = True
- print(str(count) + ". CAN报文生成失败!!!目前仅支持标准帧,暂不支持扩展帧!")
- logFile.write("%d. CAN报文生成失败!!!目前仅支持标准帧,暂不支持扩展帧!\n" % count)
- continue
- #帧类型
- elif(line.find("canType")>=0):
- canType = line.split("=")[1]
- if(canType != "0"):
- isError = True
- print(str(count) + ". CAN报文生成失败!!!目前仅支持数据帧,暂不支持其他帧!")
- logFile.write("%d. CAN报文生成失败!!!目前仅支持数据帧,暂不支持其他帧!\n" % count)
- continue
- #默认初始值
- elif(line.find("defaultValue")>=0):
- global defaultValue
- defaultValue = int(line.split("=")[1])
- #MSG名称
- elif(line.find("msgName")>=0):
- msgName = line.split("=")[1]
- #MSGID
- elif(line.find("msgID")>=0):
- msgID = line.split("=")[1]
- #MSG长度
- elif(line.find("msgLength")>=0):
- msgLength = line.split("=")[1]
- #signal定义
- elif(line.find("sigName")>=0):
- sigName.append(line.split(":")[0].split("=")[1])
- startBit.append(int(line.split(":")[1]))
- length.append(int(line.split(":")[2]))
- #minValue.append(int(line.split(":")[3]))
- #maxValue.append(int(line.split(":")[4]))
- setValue.append(int(line.split(":")[5]))
- elif(line.find("::end")>=0):
-
- rV,errMsg = getCANMessage()
- if(rV == "-1"):
- isError = True
- print(str(count) + ". CAN报文生成失败!!!" + errMsg)
- logFile.write("%d. CAN报文生成失败!!!%s\n" % (count,errMsg))
- continue
-
- print(str(count) + ". CAN报文生成成功!!!")
- logFile.write("%d. CAN报文生成成功!!!\n" % count)
- #----------------------------输出标题信息----------------------------
- print("msgName\t\tmsgID\t\tmsgLen\t\tmsgData")
- logFile.write("msgName\t\tmsgID\t\tmsgLen\t\tmsgData\n")
- if(len(msgName)<8):
- print(msgName + "\t\t",end="")
- logFile.write("%s\t\t" % msgName)
- else:
- print(msgName + "\t",end="")
- logFile.write("%s\t" % msgName)
- print(msgID + "\t\t",end="")
- logFile.write("%s\t\t" % msgID)
- print(msgLength + "\t\t",end="")
- logFile.write("%s\t\t" % msgLength)
- #----------------将二进制list每隔8位转换成十六进制输出----------------
- #其中,map()将list中的数字转成字符串,按照Motorola格式每隔8位采用了逆序
- # ''.join()将二进制list转换成二进制字符串,int()将二进制字符串转换成十进制
- #hex()再将十进制转换成十六进制,upper()转换成大写,两个lstrip()将"0X"删除,
- #zfill()填充两位,输出不换行,以空格分隔
- print(hex(int(''.join(map(str,CAN[7::-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[15:7:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[23:15:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[31:23:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[39:31:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[47:39:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[55:47:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2) + " ",end="")
- print(hex(int(''.join(map(str,CAN[63:55:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s " % hex(int(''.join(map(str,CAN[7::-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s " % hex(int(''.join(map(str,CAN[15:7:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s " % hex(int(''.join(map(str,CAN[23:15:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s " % hex(int(''.join(map(str,CAN[31:23:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s " % hex(int(''.join(map(str,CAN[39:31:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s " % hex(int(''.join(map(str,CAN[47:39:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s " % hex(int(''.join(map(str,CAN[55:47:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
- logFile.write("%s\n" % hex(int(''.join(map(str,CAN[63:55:-1])),2)).upper().lstrip("0").lstrip("X").zfill(2))
-
- config.close()
-
- #十进制转换成二进制list
- def octToBin(octNum, bit):
- while(octNum != 0):
- bit.append(octNum%2)
- octNum = int(octNum/2)
- for i in range(64-len(bit)):
- bit.append(0)
-
- #获取CAN报文值
- def getCANMessage():
- CAN.clear()
- for i in range(64):
- CAN.append(-1)
- for i in range(len(startBit)):
- #长度超过1Byte的情况,暂不支持
- if(length[i]>16):
- errMsg = " CAN信号长度超过2Byte,暂不支持!!!"
- #print(sigName[i] + errMsg)
- return "-1",errMsg
- #长度未超过1Byte的情况且未跨字节的信号
- if((startBit[i]%8 + length[i])<=8):
- for j in range(length[i]):
- bit = []
- #setValue的二进制值按字节位从低到高填
- octToBin(setValue[i],bit)
- #填满字节长度值
- if(CAN[startBit[i]+j]==-1):
- CAN[startBit[i]+j] = bit[j]
- #字节存在冲突
- else:
- errMsg = " 字节位存在冲突,生成CAN报文失败!!!"
- #print(sigName[i] + errMsg)
- return "-1",errMsg
- #跨字节的信号
- else:
- #高位位数和低位位数
- highLen = 8 - startBit[i]%8
- lowLen = length[i] - highLen
- bit = []
- #setValue的二进制值按字节位从低到高填
- octToBin(setValue[i],bit)
- #先填进信号的高位
- for j1 in range(highLen):
- if(CAN[startBit[i]+j1]==-1):
- CAN[startBit[i]+j1] = bit[j1]
- #字节存在冲突
- else:
- errMsg = " 字节位存在冲突,生成CAN报文失败!!!"
- #print(sigName[i] + errMsg)
- return "-1",errMsg
- #再填进信号的低位
- for j2 in range(lowLen):
- if(CAN[(int(startBit[i]/8)-1)*8+j2]==-1):
- CAN[(int(startBit[i]/8)-1)*8+j2] = bit[highLen+j2]
- #字节存在冲突
- else:
- errMsg = " 字节位存在冲突,生成CAN报文失败!!!"
- #print(sigName[i] + errMsg)
- return "-1",errMsg
- #剩余位设为默认值
- for i in range(64):
- if(CAN[i]==-1):
- CAN[i] = defaultValue
-
- #若无错误则返回正确值
- return "0","success!"
-
- if __name__ == "__main__":
- #调用parseConfig()函数开始执行程序
- parseConfig()

- 1. CAN报文生成成功!!!
- msgName msgID msgLen msgData
- BCM_FrP01 0x2CD 8 A5 00 06 A5 00 06 40 00
- 2. CAN报文生成成功!!!
- msgName msgID msgLen msgData
- BCM_FrP 0x2CD 8 00 00 00 00 08 00 00 00
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。