CAPL與Python交互的實(shí)現(xiàn)
前言
Python是很強(qiáng)大的膠水語(yǔ)言,學(xué)會(huì)了怎么用CAPL與Python交互,那CAPL就能做超級(jí)多的功能。
不要因?yàn)闆](méi)用過(guò)Python放棄這么好的工具,因?yàn)镻ython用戶(hù)太多了,你直接百度搜索想要Python實(shí)現(xiàn)什么功能,很多時(shí)候AI都幫你把Python代碼寫(xiě)好了,拿來(lái)調(diào)試下就能用,關(guān)鍵是用過(guò)一次之后,可能就會(huì)發(fā)現(xiàn)打開(kāi)了新世界的大門(mén)。
1、CAPL怎么調(diào)Python?
1.1CAPL調(diào)Python的命令
命令:sysExecCmd
//long sysExecCmd(char cmd[], char params[], char directory[]); // 幫助手冊(cè)里可以搜到用法 sysExecCmd("python Find_Com_Index.py", "", "./");
這個(gè)命令就是調(diào)windows的CMD窗口去做操作,
第一個(gè)參數(shù):char cmd[]
要執(zhí)行的命令,也就是要通過(guò)CMD調(diào)的應(yīng)用程序,可以是bat腳本,可以是某個(gè)exe程序,當(dāng)然也可以是python了,如果是python,就可以后面接python要接的腳本Find_Com_Index.py
第二個(gè)參數(shù):char params[]
這個(gè)是最有用的,就是調(diào)python腳本或者調(diào)別的exe,bat等入口參數(shù)
第三個(gè)參數(shù)
是這個(gè)命令的絕對(duì)路徑,或者相對(duì)于工作目錄的相對(duì)路徑。如果是python的話(huà),因?yàn)榘凑誴ython的時(shí)候,已經(jīng)給python配置好環(huán)境變量了,就是你在CMD窗口里輸入python之后,CMD就會(huì)根據(jù)環(huán)境變量里配置的路徑去找到python.exe執(zhí)行文件調(diào)用,那這個(gè)時(shí)候路徑這個(gè)參數(shù)就要填你要調(diào)用的腳本(.py)的路徑。
python腳本的路徑可以直接寫(xiě)全,絕對(duì)路徑:“C:\Work\Demo”
但是每個(gè)人的工程存放路徑不一致,建議還是用相對(duì)工程路徑:“./“代表py腳本和canoe工程文件.cfg文件在同一個(gè)目錄
如果你想在canoe工程文件.cfg文件目錄下再建一個(gè)文件夾專(zhuān)門(mén)放py腳本就可以用”./Python_Script”
1.2CAPL調(diào)用Python實(shí)例
很多測(cè)試用例里都有Power ON/OFF或者調(diào)節(jié)電壓的需求,比較便宜的程序控制電源都支持串口通信控制電源開(kāi)關(guān)和電壓。
CAPL可以調(diào)用內(nèi)置函數(shù)RS232Send命令通過(guò)COM口發(fā)送命令,但是前提是需要通過(guò)RS232Open命令打開(kāi)對(duì)應(yīng)的COM口.針對(duì)自己的電腦,你的232串口插上之后可以通過(guò)設(shè)備管理器找到對(duì)應(yīng)的COM口,然后在CAPL里配置,但是別人用你的腳本測(cè)試的時(shí)候可能COM口序列號(hào)就不一樣了,每次都要重新修改,如果能用python找到COM號(hào),那誰(shuí)都能用你的腳本了。
用python尋找你電腦上插的232串口線(xiàn)的COM號(hào)就比較簡(jiǎn)單了,百度一搜一大堆,退一步講,你從網(wǎng)上抄的python腳本一運(yùn)行就報(bào)錯(cuò),別怕,python用戶(hù)多,你遇到的這點(diǎn)小問(wèn)題,前人歷經(jīng)了N多遍,搜一下就能解決python報(bào)錯(cuò)了。
Python腳本如下:網(wǎng)上搜到的,先把電腦識(shí)別到的所有COM打印出來(lái),看看長(zhǎng)什么樣子,再找自己想要的
import serial import serial.tools.list_ports def Get_Power_COM_Index(): ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個(gè)也沒(méi)找到就報(bào)錯(cuò) print("there is no Serial Device") else: for comport in ports_list: print(list(comport)[0], list(comport)[1])#有COM口就把所有的COM口信息打印出來(lái) if __name__ == "__main__": Get_Power_COM_Index()
CAPL代碼:
on key 'a' { sysExecCmd("python Find_Com_Index.py", "", "./");//先不用輸入?yún)?shù),只是試驗(yàn)下調(diào)Python的效果 }
效果如下,假設(shè)電源的那根RS232線(xiàn)是COM7,其實(shí)我們運(yùn)行這個(gè)腳本的最終目的就是要拿到這個(gè)‘7’,用這個(gè)7讓CAPL打開(kāi)7這個(gè)COM口:
那怎么拿到這個(gè)7, 我們可以用如果‘USB-to-Serial’這個(gè)字符串存在COM口信息里,就能獲取到第4行的信息, 再把第4行按照空格分隔字符串,就能得到COM7,再把COM7里的COM刪除調(diào),就能拿到‘7’
Python:
import serial import serial.tools.list_ports def Get_Power_COM_Index(): ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個(gè)也沒(méi)找到就報(bào)錯(cuò) print("there is no Serial Device") else: for comport in ports_list: #print(list(comport)[0], list(comport)[1])#調(diào)試的時(shí)候打印,正式用的時(shí)候可打可不打了 if 'USB-to-Serial' in list(comport)[1]:#判斷‘USB-to-Serial'這個(gè)字符串存在COM口信息里 COM_Channel = list(comport)[0]#在的話(huà)就把‘COM7'取出來(lái) COM_Channel = COM_Channel.strip('COM')#把‘COM'字符串拿掉 Return_Value = int(COM_Channel)#把字符串7,轉(zhuǎn)換成數(shù)字7 print("The useful USB Serial Port is :",Return_Value ) if __name__ == "__main__": Get_Power_COM_Index()
這樣我們就能拿到‘7'了
2、怎么把python運(yùn)行的結(jié)果返回給CAPL
2.1通過(guò)環(huán)境變量
CAPL調(diào)python的命令:sysExecCmd的返回結(jié)果只是代表有沒(méi)有成功執(zhí)行這個(gè)命令,并不返回python運(yùn)行后的結(jié)果。
目前沒(méi)有找到更好的方法,用了繞一圈的方法:用Python調(diào)用Canoe把結(jié)果賦值給Canoe的環(huán)境變量,CAPL再取環(huán)境變量拿結(jié)果。
如果大家有更好的方法,歡迎留言。
Python怎么調(diào)用Canoe,在安裝Canoe的時(shí)候,有范例,感興趣可以研究下,我只抄了用到的一部分,路徑如下(版本可能不一致):
先在Canoe里新建環(huán)境變量,不知道怎么建的可以搜一下
然后python里,
1.用python連接上canoe
2.獲取到想要的COM的序列號(hào)
3.通過(guò)設(shè)置環(huán)境變量,把COM序列號(hào)賦值給Canoe環(huán)境變量:
import serial import serial.tools.list_ports import time, os, msvcrt from win32com.client import * from win32com.client.connect import * class CanoeSync(object): def __init__(self): self.app = Dispatch('CANoe.Application')#打開(kāi)Canoe def set_System_var(self, Namespace, system_var, Value_Set): if (self.app != None): self.app.System.Namespaces(Namespace).Variables(system_var).Value = Value_Set def Get_Power_COM_Index(): canoe = CanoeSync()#連接上Canoe,獲取句柄,有了句柄之后就可以用canoe操作CanoeSync里定義的函數(shù) ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個(gè)也沒(méi)找到就報(bào)錯(cuò) print("there is no Serial Device") else: for comport in ports_list: #print(list(comport)[0], list(comport)[1])#有COM口就把所有的COM口信息打印出來(lái) if 'USB-to-Serial' in list(comport)[1]:#判斷‘USB-to-Serial'這個(gè)字符串存在COM口信息里 COM_Channel = list(comport)[0]#在的話(huà)就把‘COM7'取出來(lái) COM_Channel = COM_Channel.strip('COM')#把‘COM'字符串拿掉 Return_Value = int(COM_Channel)#把字符串7,轉(zhuǎn)換成數(shù)字7 canoe.set_System_var("Python_Result","Result_Value",Return_Value)#把轉(zhuǎn)換后的COM號(hào),通過(guò)環(huán)境變量給到Canoe if __name__ == "__main__": Get_Power_COM_Index()
在CAPL里
1.按鍵’a’調(diào)用Python腳本去讀COM序列號(hào)
2.去環(huán)境變量里拿COM序列號(hào)
3.。。。
on key 'a' { sysExecCmd("python Find_Com_Index.py", "", "C:\\Work\\Demo"); } on sysvar_update Python_Result::Result_Value { write("Find Com Channel is: %d",@Python_Result::Result_Value); }
CAPL的打印結(jié)果:
3、CAPL調(diào)Python的輸入?yún)?shù)
如果調(diào)python的時(shí)候沒(méi)有帶輸入?yún)?shù),回有很大的不方便:
1.調(diào)一個(gè)python腳本實(shí)現(xiàn)一個(gè)功能,那一個(gè)CAPL腳本里,可能幾十上百個(gè)調(diào)python的用的地方,總不能寫(xiě)幾百個(gè)python腳本吧,就比如說(shuō)這次是想用python找USB轉(zhuǎn)串口的COM號(hào),用的關(guān)鍵字是’USB-to-Serial’,那下一個(gè)case想找的是’Technology’的怎么辦?
把想搜索的作為輸入?yún)?shù)傳進(jìn)去:
CAPL:
on key 'b' { sysExecCmd("python Find_Com_Index.py", "Technology", "./"); }
python:把輸入?yún)?shù)作為搜索條件
import serial import serial.tools.list_ports import time, os, msvcrt from win32com.client import * from win32com.client.connect import * class CanoeSync(object): def __init__(self): self.app = Dispatch('CANoe.Application')#打開(kāi)Canoe def set_System_var(self, Namespace, system_var, Value_Set): if (self.app != None): self.app.System.Namespaces(Namespace).Variables(system_var).Value = Value_Set def Get_Power_COM_Index(str): canoe = CanoeSync()#連接上Canoe,獲取句柄,有了句柄之后就可以用canoe操作CanoeSync里定義的函數(shù) ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個(gè)也沒(méi)找到就報(bào)錯(cuò) print("there is no Serial Device") else: for comport in ports_list: #print(list(comport)[0], list(comport)[1])#有COM口就把所有的COM口信息打印出來(lái) if str in list(comport)[1]:#判斷str這個(gè)字符串存在COM口信息里 COM_Channel = list(comport)[0]#在的話(huà)就把‘COMx'取出來(lái) COM_Channel = COM_Channel.strip('COM')#把‘COM'字符串拿掉 Return_Value = int(COM_Channel)#把字符串轉(zhuǎn)換成數(shù)字 canoe.set_System_var("Python_Result","Result_Value",Return_Value)#把轉(zhuǎn)換后的COM號(hào),通過(guò)環(huán)境變量給到Canoe if __name__ == "__main__": CMD1 = sys.argv[1] Get_Power_COM_Index(CMD1)
2,你想用python打開(kāi)某個(gè)文件,寫(xiě)入某個(gè)值,操作的文件名,寫(xiě)入的數(shù)最好都是可以通過(guò)輸入?yún)?shù)傳進(jìn)去的,而不是要寫(xiě)n多個(gè)python。多個(gè)參數(shù)的傳入時(shí),參數(shù)與參數(shù)之間,用空格代替。
CAPL:
on key 'c' { sysExecCmd("python test.py", "a.txt 12345", "./"); }
import sys def write_txt(filename,value): with open(filename,'a') as f: f.write(value) if __name__ == "__main__": CMD1 = sys.argv[1] CMD2 = sys.argv[2] write_txt(CMD1,CMD2)
到此這篇關(guān)于CAPL與Python交互的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)CAPL與Python交互內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python命令行交互引導(dǎo)用戶(hù)輸入一個(gè)數(shù)字實(shí)現(xiàn)
- Gradio構(gòu)建交互式Python應(yīng)用使用示例詳解
- 如何使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束及解析JSON結(jié)果
- Python Shiny庫(kù)創(chuàng)建交互式Web應(yīng)用及高級(jí)功能案例
- Python?ctypes庫(kù)底層交互秘籍實(shí)例探究
- python?spotlight庫(kù)簡(jiǎn)化交互式方法探索數(shù)據(jù)分析
- Python與HTTP服務(wù)交互的三種方式
相關(guān)文章
關(guān)于PyCharm安裝后修改路徑名稱(chēng)使其可重新打開(kāi)的問(wèn)題
這篇文章主要介紹了關(guān)于PyCharm安裝后修改路徑名稱(chēng)使其可重新打開(kāi)的問(wèn)題,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10python類(lèi)的方法屬性與方法屬性的動(dòng)態(tài)綁定代碼詳解
這篇文章主要介紹了python類(lèi)的方法屬性與方法屬性的動(dòng)態(tài)綁定代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12解決json中ensure_ascii=False的問(wèn)題
這篇文章主要介紹了解決json中ensure_ascii=False的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04基于Python 裝飾器裝飾類(lèi)中的方法實(shí)例
下面小編就為大家分享一篇基于Python 裝飾器裝飾類(lèi)中的方法實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04