摘要:,語(yǔ)言實(shí)現(xiàn)儀表控制可以采用種方式,一種是使用編程,使用驅(qū)動(dòng)自帶的文件進(jìn)行開(kāi)發(fā),但是感覺(jué)怪怪的,感覺(jué)這樣還不如直接使用進(jìn)行開(kāi)發(fā),還有現(xiàn)成的版本可用。硬件信息為查詢(xún)儀表清單。類(lèi)型轉(zhuǎn)換是必須的,的是由首字符指針長(zhǎng)度組成。
golang,go語(yǔ)言實(shí)現(xiàn)儀表控制可以采用2種方式,一種是使用CGO編程,使用驅(qū)動(dòng)自帶的VISA.H文件進(jìn)行開(kāi)發(fā),但是感覺(jué)怪怪的,感覺(jué)這樣還不如直接使用C進(jìn)行開(kāi)發(fā),還有現(xiàn)成的版本可用。因此本文使用的是調(diào)用dll的方式來(lái)進(jìn)行。
viOpenDefaultRM:打開(kāi)設(shè)備管理器,初始化。
func?OpenRM()?uintptr?{????VISA32?:=?syscall.NewLazyDLL("visa32.dll")????viOpenDefaultRM?:=?VISA32.NewProc("viOpenDefaultRM")????ret,?_,?_?:=?viOpenDefaultRM.Call(uintptr(unsafe.Pointer(&resourceManager)))????fmt.Println("硬件信息為:",?resourceManager)????return?ret}
viFindRsrc:查詢(xún)儀表清單。
func?FindRsrc()?bool?{????VISA32?:=?syscall.NewLazyDLL("visa32.dll")????viFindRsrc?:=?VISA32.NewProc("viFindRsrc")????var?list?int?=?0????instrDor?:=?getMyString("?*")????var?data?[180]byte????retcnt?:=?0????ret,?_,?_?:=?viFindRsrc.Call(uintptr(resourceManager),?uintptr(unsafe.Pointer(instrDor.Str)),?uintptr(unsafe.Pointer(&list)),?uintptr(unsafe.Pointer(&retcnt)),?uintptr(unsafe.Pointer(&data)))????if?ret?!=?0?{????????fmt.Println("查詢(xún)代碼:",?ret)????????return?false????}????fmt.Println("查詢(xún)成功->")????viFindNext?:=?VISA32.NewProc("viFindNext")????viFindNext.Call(uintptr(list),?uintptr(unsafe.Pointer(&data)))????s?:=?string(Bytes2string(data))????viClose?:=?VISA32.NewProc("viClose")????viClose.Call(uintptr(list))????fmt.Println(s)????return?true}
viOpen:使用地址打開(kāi)儀表。
????instrDor?:=?getMyString(addr)????VISA32?:=?syscall.NewLazyDLL("visa32.dll")????viOpen?:=?VISA32.NewProc("viOpen")????var?instr?int?=?0????ret,?_,?_?:=?viOpen.Call(uintptr(resourceManager),?uintptr(unsafe.Pointer(instrDor.Str)),?uintptr(0),?uintptr(0),?uintptr(unsafe.Pointer(&instr)))????if?instr?==?0?{????????return?"打開(kāi)儀器失敗,錯(cuò)誤代碼為:"?+?fmt.Sprint(ret)????}
viClose:關(guān)閉設(shè)備管理器,關(guān)閉儀器清單,關(guān)閉打開(kāi)的儀表(可以理解為釋放內(nèi)存)上面的3個(gè)函數(shù)都要。
viPrintf/viScanf:發(fā)送和接收儀表的數(shù)據(jù)
//?發(fā)送信息給儀表//?addr為儀器地址,m為需要發(fā)送的信息,如GPIB0::15::INSTR,send:DISP?TXfunc?SendMsg(addr,?m?string)?string?{????instrDor?:=?getMyString(addr)????VISA32?:=?syscall.NewLazyDLL("visa32.dll")????viOpen?:=?VISA32.NewProc("viOpen")????var?instr?int?=?0????ret,?_,?_?:=?viOpen.Call(uintptr(resourceManager),?uintptr(unsafe.Pointer(instrDor.Str)),?uintptr(0),?uintptr(0),?uintptr(unsafe.Pointer(&instr)))????if?instr?==?0?{????????return?"打開(kāi)儀器失敗,錯(cuò)誤代碼為:"?+?fmt.Sprint(ret)????}????m?=?m?+?"/n"????msg?:=?getMyString(m)????viPrintf?:=?VISA32.NewProc("viPrintf")????ret2,?_,?_?:=?viPrintf.Call(uintptr(instr),?uintptr(unsafe.Pointer(msg.Str)))????viClose?:=?VISA32.NewProc("viClose")????viClose.Call(uintptr(instr))????if?ret2?==?0?{????????return?"信息發(fā)送成功!---"?+?m????}????return?"發(fā)送失敗,代碼為:"?+?fmt.Sprint(ret2)}//?發(fā)送信息給儀表,并等待儀表返回?cái)?shù)據(jù)。func?ReadData(addr,?m?string)?string?{????instrDor?:=?getMyString(addr)????VISA32?:=?syscall.NewLazyDLL("visa32.dll")????viOpen?:=?VISA32.NewProc("viOpen")????var?instr?int?=?0????ret,?_,?_?:=?viOpen.Call(uintptr(resourceManager),?uintptr(unsafe.Pointer(instrDor.Str)),?uintptr(0),?uintptr(0),?uintptr(unsafe.Pointer(&instr)))????if?instr?==?0?{????????return?"打開(kāi)儀器失敗,錯(cuò)誤代碼為:"?+?fmt.Sprint(ret)????}????m?=?m?+?"/n"????msg?:=?getMyString(m)????viPrintf?:=?VISA32.NewProc("viPrintf")????viPrintf.Call(uintptr(instr),?uintptr(unsafe.Pointer(msg.Str)))????readFmt?:=?getMyString("%t")????viScanf?:=?VISA32.NewProc("viScanf")????var?data?[180]byte????viScanf.Call(uintptr(instr),?uintptr(unsafe.Pointer(readFmt.Str)),?uintptr(unsafe.Pointer(&data)))????s?:=?string(Bytes2string(data))????viClose?:=?VISA32.NewProc("viClose")????viClose.Call(uintptr(instr))????return?s}// 返回的數(shù)據(jù)后面有很多個(gè)0,截?cái)嗵幚頃?huì)更好些。func Bytes2string(data [180]byte) string { for i := 0; i < len(data); i++ { if data[i] == 10 || data[i] == 0 { return string(data[:i]) } } return string(data[:])}
go語(yǔ)言的string與C的string是有所區(qū)別的,gostring的結(jié)構(gòu)是首字符的指針+長(zhǎng)度,而Cstring的結(jié)構(gòu)只有首字符指針,然后讀取時(shí)順序讀到字符0為止。因此在傳遞中要進(jìn)行轉(zhuǎn)換,比如:
使用CGO使用C.CString進(jìn)行轉(zhuǎn)換,但這個(gè)方式會(huì)導(dǎo)致內(nèi)存不能釋放。
文中采用了另一種方式,改造結(jié)構(gòu)體的方式,因此采用了另一種結(jié)構(gòu)體MyString。
//?新建類(lèi)型,代替C.CString//?C.CString使用會(huì)產(chǎn)生拷貝,并不會(huì)自動(dòng)釋放,需要進(jìn)行free。type?MyString?struct?{????Str?unsafe.Pointer????Len?int}//類(lèi)型轉(zhuǎn)換//?/x00是必須的,go的string是由首字符指針+長(zhǎng)度組成。而C的string只有首字符指針,長(zhǎng)度由字節(jié)0來(lái)確定,即順序讀,直到讀到0。/x00即代表字符0func?getMyString(s?string)?*MyString?{????s?=?s?+?"/x00"????return?(*MyString)(unsafe.Pointer(&s))}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121761.html
摘要:如果說(shuō)是主要針對(duì)和的三個(gè)關(guān)鍵信息成長(zhǎng)和,那么上午則是專(zhuān)注的企業(yè)級(jí)應(yīng)用。將以季度為單位進(jìn)行版本更新。天的已經(jīng)接近尾聲,金融保險(xiǎn)兩大客戶(hù)現(xiàn)身說(shuō)法,企業(yè)級(jí)初現(xiàn)崢嶸,從技術(shù)到商業(yè)落地,從開(kāi)發(fā)者到企業(yè)級(jí)用戶(hù),容器世界的大門(mén)已經(jīng)打開(kāi)。 If the container ecosystem succeeds, Docker succeeds. showImg(https://segmentfault...
摘要:為了了解被這種木馬感染的地區(qū)分布情況,我們分析了相關(guān)檢測(cè)部分的運(yùn)行狀況。受到感染影響最嚴(yán)重的區(qū)域?yàn)橹心厦赖母鐐惐葋單瘍?nèi)瑞拉秘魯墨西哥阿根廷以及亞洲的菲利賓越南和歐洲的波蘭。通信協(xié)議目前發(fā)現(xiàn)的服務(wù)器有。響應(yīng)結(jié)構(gòu)采用以分割的字符串?dāng)?shù)組的形式。 在最近幾個(gè)星期里的AVAST惡意樣本分析名單中,Win32/64:Napolar擁有極高的文件和網(wǎng)絡(luò)屏蔽率。另外,我們發(fā)現(xiàn)了被冠以Solarbot名...
摘要:原文出自聽(tīng)云技術(shù)博客斷斷續(xù)續(xù)寫(xiě)了將近一個(gè)月,聽(tīng)云第一版數(shù)據(jù)庫(kù)管理平臺(tái)終于寫(xiě)完了,期間來(lái)來(lái)回回的改了好多次小毛病,現(xiàn)在已經(jīng)部署到生產(chǎn)環(huán)境上去了。主機(jī)管理這里主要是主機(jī)列表管理和業(yè)務(wù)組列表管理。 原文出自【聽(tīng)云技術(shù)博客】:http://blog.tingyun.com/web/article/detail/600 斷斷續(xù)續(xù)寫(xiě)了將近一個(gè)月,聽(tīng)云第一版數(shù)據(jù)庫(kù)管理平臺(tái)終于寫(xiě)完了,期間來(lái)來(lái)回回的改...
摘要:最終我厭倦了這樣的方式,雖然很懷念完備的功能,我還是開(kāi)始使用內(nèi)聯(lián)匯編來(lái)解決問(wèn)題。禁用棧緩沖區(qū)安全檢查。為了使微軟編譯器在棧上動(dòng)態(tài)的分配字符以便重定位,你需要如下處理你會(huì)發(fā)現(xiàn),我將字符串聲明為字符數(shù)組的形式。 背景 有時(shí)候程序員們需要寫(xiě)一段獨(dú)立于位置操作的代碼,可當(dāng)作一段數(shù)據(jù)寫(xiě)到其他進(jìn)程或者網(wǎng)絡(luò)中去。該類(lèi)型代碼在它誕生之初就被稱(chēng)為shellcode,在軟件中黑客們以此獲取到shell權(quán)...
閱讀 3292·2021-11-18 10:02
閱讀 1494·2021-10-12 10:08
閱讀 1307·2021-10-11 10:58
閱讀 1311·2021-10-11 10:57
閱讀 1214·2021-10-08 10:04
閱讀 2165·2021-09-29 09:35
閱讀 810·2021-09-22 15:44
閱讀 1311·2021-09-03 10:30