日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

在将varchar值id转换为int时失败_Python—CAN报文转换工具教程

發布時間:2025/1/21 python 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在将varchar值id转换为int时失败_Python—CAN报文转换工具教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、CAN報文簡介

CAN是控制器局域網絡(Controller Area Network, CAN)的簡稱,是由以研發和生產汽車電子產品著稱的德國BOSCH公司開發的,并最終成為國際標準(ISO 11898),是國際上應用最廣泛的現場總線之一。 在北美和西歐,CAN總線協議已經成為汽車計算機控制系統和嵌入式工業控制局域網的標準總線,并且擁有以CAN為底層協議專為大型貨車和重工機械車輛設計的J1939協議。

CAN總線以報文為單位進行數據傳送。CAN報文按照幀格式可分為標準幀和擴展幀,標準幀是具有11位標識符的CAN幀,擴展幀是具有29位標識符的CAN幀。按照幀類型可分為:1.從發送節點向其它節點發送數據;2.遠程幀:向其它節點請求發送具有同一識別符的數據幀;3.錯誤幀:指明已檢測到總線錯誤;4.過載幀:過載幀用以在數據幀(或遠程幀)之間提供一附加的延時。共有兩種編碼格式:Intel格式和Motorola格式,在編碼優缺點上,Motorola格式與Intel格式并沒有孰優孰劣之分,只不過根據設計者的習慣,由用戶自主選擇罷了。當然,對于使用者來講,在進行解析之前,就必須要知道編碼的格式是哪一種,否則,就不能保證正確地解析信號的含義。以下就以8位字節編碼方式的CAN總線信號為例,詳細分析一下兩者之間的區別。

Intel編碼格式

當一個信號的數據長度不超過1個字節(8位)并且信號在一個字節內實現(即該信號沒有跨字節實現):該信號的高位(S_msb)將被放在該字節的高位,信號的低位(S_lsb)將被放在該字節的低位。
當一個信號的數據長度超過1個字節(8位)或者數據長度不超過一個字節但是采用跨字節方式實現時:該信號的高位(S_msb)將被放在高字節(MSB)的高位,信號的低位(S_lsb)將被放在低字節(LSB)的低位。

Motorola編碼格式

當一個信號的數據長度不超過1個字節(8位)并且信號在一個字節內實現(即該信號沒有跨字節實現):該信號的高位(S_msb)將被放在該字節的高位,信號的低位(S_lsb)將被放在該字節的低位。
當一個信號的數據長度超過1個字節(8位)或者數據長度不超過一個字節但是采用跨字節方式實現時:該信號的高位(S_msb)將被放在低字節(MSB)的高位,信號的低位(S_lsb)將被放在高字節(LSB)的低位。
可以看出,當一個信號的數據長度不超過1Byte時,Intel與Motorola兩種格式的編碼結果沒有什么不同,完全一樣。當信號的數據長度超過1Byte時,兩者的編碼結果出現了明顯的不同。

二、CAN報文轉換工具需求分析

1、 支持標準幀的CAN報文的轉換,擴展幀暫不支持

2、 CAN報文支持Intel、motorola兩種編碼,先支持motorola格式,后期追加Intel格式

3、 工具具有一定的容錯處理能力、報告生成能力

4、 制定統一格式,方便使用者修改測試腳本

5、增加交互模式,鍵盤輸入,控制臺輸出;例如:

提示語:startBit:length:minValue:maxValue:setValue

輸入:35:1:0:1:1

控制臺輸出:00 00 00 00 08 00 00 00

Intel和Motorola編碼舉例:

三、交互模式

代碼如下:

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):breakif(input_str.count(":")<4):print("輸入格式錯誤,參數缺少setValue,請重新輸入!")continueif(input_str.split(":")[4]==""):print("setValue參數不能為空,請重新輸入!")continuesig.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]%8lowLen = length[i] - highLenbit = []#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 = 0isError = Falsefor line in config:line = line.strip()#注釋if(line.find("#")>=0):continue#開始標記elif(line.find("::start")>=0):count = count + 1isError = Falseif(count>1):sigName.clear()startBit.clear()length.clear()setValue.clear()continueelse:continueelif(isError == True):continue#編碼格式elif(line.find("encodeType")>=0):encodeType = line.split("=")[1]if(encodeType != "1"):isError = Trueprint(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 = Trueprint(str(count) + ". CAN報文生成失敗!!!目前僅支持標準幀,暫不支持擴展幀!")logFile.write("%d. CAN報文生成失敗!!!目前僅支持標準幀,暫不支持擴展幀!n" % count)continue#幀類型elif(line.find("canType")>=0):canType = line.split("=")[1]if(canType != "0"):isError = Trueprint(str(count) + ". CAN報文生成失敗!!!目前僅支持數據幀,暫不支持其他幀!")logFile.write("%d. CAN報文生成失敗!!!目前僅支持數據幀,暫不支持其他幀!n" % count)continue#默認初始值elif(line.find("defaultValue")>=0):global defaultValuedefaultValue = int(line.split("=")[1])#MSG名稱elif(line.find("msgName")>=0):msgName = line.split("=")[1]#MSGIDelif(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 = Trueprint(str(count) + ". CAN報文生成失敗!!!" + errMsg)logFile.write("%d. CAN報文生成失敗!!!%sn" % (count,errMsg))continueprint(str(count) + ". CAN報文生成成功!!!")logFile.write("%d. CAN報文生成成功!!!n" % count)#----------------------------輸出標題信息----------------------------print("msgNamettmsgIDttmsgLenttmsgData")logFile.write("msgNamettmsgIDttmsgLenttmsgDatan")if(len(msgName)<8):print(msgName + "tt",end="")logFile.write("%stt" % msgName)else:print(msgName + "t",end="")logFile.write("%st" % msgName)print(msgID + "tt",end="")logFile.write("%stt" % msgID)print(msgLength + "tt",end="")logFile.write("%stt" % 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("%sn" % 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]%8lowLen = length[i] - highLenbit = []#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

總結

以上是生活随笔為你收集整理的在将varchar值id转换为int时失败_Python—CAN报文转换工具教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。