❶ 怎麼在C++程序中調用驅動程序的函數
Unix/Linux嗎?
可以使用open,close,read,write,ioctl 系統調用(system call),內核將會把這些調用最終傳遞給設備驅動程序的相應函數去執行並返回結果的。
❷ 微信web前端開發,調用設備相機和相冊的介面怎麼用
後台介面代碼
String accessJsapiTicket = AccessJsapiTicketBLL.getAccessJsapiTicket();
String noncestr = StringUtils.genNoncestr(15);
long timestamp = System.currentTimeMillis()/1000;
String signature = SignatureFactory.sign(accessJsapiTicket, noncestr, timestamp, url);
Map<String, String> map = new HashMap<String, String>();
map.put("timestamp", "" + timestamp);
map.put("nonceStr", noncestr);
map.put("signature", signature);
map.put("id", ManageKeyUtils.getValueByKey("wx_mp_app_id"));
return writer().write(JackSonTool.parse2Json(map));---------------------------------------------------------------public static String sign(String jsapi_ticket, String noncestr, long timestamp, String url) {
String s = "jsapi_ticket=" + jsapi_ticket
+ "&noncestr=" + noncestr
+ "×tamp=" + timestamp
+ "&url=" + url;
return SHA1.crypt(s);
}-----------------------------------------------------------------public static String crypt(String str) {
byte[] inputData = str.getBytes();
String returnString = "";
try {
MessageDigest sha = MessageDigest.getInstance("SHA");
sha.update(inputData);
returnString = byte2hex(sha.digest());
} catch (Exception e) {
e.printStackTrace();
}
return returnString;
}
private static String byte2hex(byte bytes[]) {
StringBuffer retString = new StringBuffer();
for (int i = 0; i < bytes.length; ++i) {
retString.append(Integer.toHexString(0x0100 + (bytes[i] & 0x00FF)).substring(1));
}
return retString.toString();
}
頁面js代碼
var map = $!map;//從後台獲取這幾個對象
wx.config({
debug: false, //調試階段建議開啟
appId:map.id ,
timestamp:map.timestamp ,
nonceStr:map.nonceStr ,
signature:map.signature ,
jsApiList: [
/* * 所有要調用的 API 都要加到這個列表中 * 這里以圖像介面為例 */
"chooseImage",
"previewImage",
"uploadImage",
"downloadImage"
]
});
//定義images用來保存選擇的本地圖片ID,和上傳後的伺服器圖片ID
var images = {
localId: [],
serverId: []
};
wx.ready(function () {
//拍照、本地選圖
document.querySelector('.enroll_img').onclick = function () {
wx.chooseImage({
success: function (result) {
//dosomething
}
});
}
})
❸ 聯想筆記本E40usb視頻設備怎麼安裝USB視頻設備需要有程序來調用,程序怎麼用
正常在買USB視頻的時候應該是有配驅動的(一張小的光碟),USB視頻設備插入電腦時如果提示需要驅動,請把驅動光碟裝入電腦光碟機內,打開光碟上的文件安裝好驅動;
如果沒有光碟驅動,你可以按你購買的牌子在網上搜索一個萬能驅動安裝上你的電腦內,這方面的軟體方面比較多的。你搜索一下就知道了。
❹ c# 怎麼調用手持設備二維碼模塊
這個是不是調用啊。這個僅僅是執行。如果是說調 用的話。python for .net和iron python都支持.net調 用python的模塊。
不過僅僅是執行的話也容易。假設你的start.py是一個可以執行的程序。是執行不是調用。不是import。
那麼你不需要set search paths,因為這個path是給import,也就是調用使用的。你set path沒有用。
你只需要全路徑帶過去,把start.py的全路徑補全了就可以了。
要實現調用,還需要將python的模塊編譯成c#可以使用的庫的形式。才可以直接用c#的方法import進來。很簡單的。而不需要使用python這個engine。
理論上講,如果.net支持動態載入。也可以使用動態載入的方法,使用python這個engine動態載入一個模塊。不過我不知道python for .net和iron python有沒有實現。這個太麻煩了。應該沒有完成。
所以你還是將python的代碼使用python for .net或者是iron python編譯生成可以發布的庫。後面就簡單的了。直接在.net里import就好了。
❺ 操作系統怎樣識別 驅動程序,怎樣調用驅動程序的
在電腦上安裝新設備後會被操作系統識別,如果該設備被正確識別,操作系統會調用驅動程序庫里的程序並自動安裝驅動程序。
如果該設備無法被正確識別,則在設備管理器里的新設備就會出現帶問號的提示,此時就需要安裝相應的驅動軟體。
❻ 如何使用c++編寫應用程序,調用驅動程序sys文件中的函數
一般的驅動程序是不允許應用程序調用的,只有當驅動程序留出這種供外界訪問的介面才行,這種介面一般包括read,write,open,ioctl等介面,如果驅動中預留出了這些介面,就可以在應用程序中調用,比如fd=open(設備,參數);或者fd=ioctl(設備,參數);,這樣就會調用到這個設備驅動中的open或者ioctl函數。所以一般如果想再應用程序中調試某個驅動程序,常見的方法就是自己建立一個驅動模塊,這個模塊中預留出對外介面,比如ioctl。然後在你新建的這個驅動模塊中完成ioctl函數,如下:
int device_ioctl(fd,argv) {
/* your function; */
}
static struct file_operations device = {
.ioctl = device_ioctl //預留外部介面
};
應用程序如下:
ioctl(device,argv);
上面這句就可以完成你的模塊中ioctl中的功能。
❼ 什麼叫驅動程序,那是干什麼的
驅動程序,指的是設備驅動程序(Device Driver),是一種可以使計算機和設備進行相互通信的特殊程序。
作用:驅動程序主要作用是計算機系統與硬體設備之間完成數據傳送的功能,只有藉助驅動程序,兩者才能通信並完成特定的功能。驅動程序是介於操作系統與硬體之間的媒介,實現雙向的傳達,將硬體設備本身具有的功能傳達給操作系統,同時也將操作系統的標准指令傳達給硬體設備。
(7)調用設備需要什麼程序擴展閱讀:
在Windows系統中,需要安裝主板、光碟機、顯卡、音效卡等一套完整的驅動程序。
如果需要外接別的硬體設備,則還要安裝相應的驅動程序,如外接游戲硬體要安裝手柄、方向盤、搖桿、跳舞毯等的驅動程序,外接列印機要安裝列印機驅動程序,上網或接入區域網要安裝網卡、Modem甚至ISDN、ADSL的驅動程序。
驅動程序一般可通過三種途徑得到,購買的硬體附帶有驅動程序;Windows系統自帶有大量驅動程序;從Internet下載驅動程序。最後一種途徑往往能夠得到最新的驅動程序。
❽ Android應用程序調用底層設備驅動問題,求答!
在啟動腳本init.rc中,先執行chown命令更改設備的所有者為system,之後用chmod命令更改許可權。例子如下:
# North Green for mydev
chown system system /dev/mydev
chmod 0777 /dev/mydev
❾ 主機系統軟體什麼時候調用設備驅動程序
使用設備的時候。比如你點列印,電腦就會通過列印機的驅動程序調用列印機完成列印。
❿ 在PC機COM埠接外部設備輸入信號。如何調用該埠,使用什麼語言
用於串口通信的函數和結構在Winbase.h頭文件中定義。
函數 描述
CreateFile 打開串列口
GetCommState 用指定通信設備的當前控制設置填充設備控制塊(DCB結構)
SetCommState 按照DCB結構的說明配置通信設備。這個函數重新初始化所有硬體
和控制設備,但不清空I/O隊列
GetCommTimeouts 獲得指定通信設備上所有讀/寫操作的超時參數
SetCommTimeouts 設置指定通信設備上所有讀/寫操作的超時參數
WriteFile 向串列口寫數據,這樣將把數據傳送給串列連接另一端的設備
ReadFile 從串列口讀數據,這樣將從串列連接另一端的設備接收數據
SetCommMask 指定為通信設備監視的一組事件
GetCommMask 獲得指定通信設備的事件掩碼值
WaitCommEvent 等待指定通信設備的事件的發生。WaitCommEvent函數監視的事件
包含在與設備句柄相關聯的事件掩碼中
EscapeCommFunction 指導指定通信設備執行擴展功能。通常用於將串列口設置為IR模式
ClearCommBreak 恢復指定通信設備的字元傳輸,並設置傳輸線路為不可中斷狀態
ClearCommError 獲得通信錯誤數據,並報告指定通信設備的當前狀態
打開埠
CreateFile函數用於打開串列口,因為硬體供應商和設備驅動程序開發者可以隨意命名埠,所以應用程序應該列出所有可用埠,從而使用戶能夠指定要打開的埠。如果埠不存在,則CreateFile函數返回ERROR_FILE_NOT_FOUND,而且應該通知用戶埠不可用。
打開串列口
1 在第一個參數lpzPortName指向的通信口後插入一個冒號。例如,指定「COM1:」為通信埠。
2 指定dwShareMode參數為0。通信埠不能像文件一樣被共享。
3 在dwCreationDisposition參數中指定OPEN_EXISTING。這個標志是必須的。
4 指定dwFlagsAndAttributes參數為0。Windows CE只支持非重疊I/0.
下面的代碼段說明了如何打開串列通信埠。
hPort=CreateFile(lpszPortName, //指出通信埠
GENERIC_READ|GENERIC_WRITE, //讀寫模式
0, //共享模式
NULL, //安全屬性
OPEN_EXISTING, //如何打開服務埠
0, //埠屬性
NULL); //埠屬性句柄的拷貝
配置串列口
打開串列口後,一般情況下,應用程序需要改變預設設置。用GetCommState函數可以獲得預設設置,用SetCommState函數可以設置新的埠設置。
另外,埠配置還包括用COMMTIMEOUTS結構設置讀/寫操作的超時值。當發生超時時,ReadFile或WriteFile函數返回成功傳輸的具體字元數。
配置串列口
DCB PortDCB;
PortDCB.DCBlength=sizeof(DCB);
GetCommState(hPort,&PortDCB);
PortDCB.BaudRate=9600; //波特率
PortDCB.fBinary=TRUE; //只支持二進制串列傳輸模式
PortDCB.fParity=TRUE; //啟用奇偶校驗
PortDCB.fOutxCtsFlow=FALSE; //TRUE是由CTS線來控制埠的輸出
PortDCB.fOutxDsrFlow=FALSE; //TRUE是由DSR線來控制埠的輸出
PortDCB.fDtrControl=DTR_CONTROL_ENABLE; //DTR_CONTROL_DISABLE:
禁用DTR(Data Terminal Ready)線並保持此狀態;
DTR_CONTROL_ENABLE;
啟用DTR(Data Terminal Ready)線
DTR_CONTROL_HANDSHAKE
根據接收緩沖區數據的數量告訴串列驅動程序切換DTR線狀態
PortDCB.fDsrSensitivity=FALSE; //TRUE為埠將忽略任何輸入的位元組,除非埠DSR線被啟用
PortDCB.fTXContinueOnXoff=TRUE; //TRUE為如接收緩沖區已滿且驅動程序已傳送XOFF字元,
將使驅動程序停止傳輸字元
PortDCB.fOutX=FALSE; //TRUE為指定XON/XOFF控制被用於控制串列輸出
PortDCB.fInX=FALSE; //TRUE為指定XON/XOFF控制由輸入串列流使用
PortDCB.fErrorChar=FALSE; //Windows CE串列驅動程序默認忽略該欄位
PortDCB.fNull=FALSE; //TRUE為使串列驅動程序忽略接收到的空位元組
PortDCB.fRtsControl=RTS_CONTROL_ENABLE; //RTS_CONTROL_DISABLE表示當埠打開時RTS(Request and Send)行
將禁用
//RTS_CONTROL_ENABLE表示當埠打開時RTS行將啟用
//RTS_CONTROL_HANDSHAKE表示RTS線由驅動程序控制,輸入緩沖區
不到半滿,則RTS線將被啟用,否則將被禁用
//RTS_CONTROL_TOGGLE表示如果在輸出緩沖區有位元組要被傳輸,則
驅動程序將啟用RTS線,否則將禁用該線
PortDCB.fAbortOnError=FALSE; //出現讀/寫錯誤並不終止
PortDCB.ByteSize=8; //指定每位元組的位數
PortDCB.Parity=NOPARITY; //奇偶欄位,EVENPARITY、MARKPARITY、NOPARITY、ODDPARITY、SPACERITY
PortDCB.StopBits=ONESTOPBIT; //停止位,每位元組一位(ONESTOPBIT)、一位半(ONE5STOPBITS)、
兩位(TWOSTOPBITS)。
if(!SetCommState(hPort,&PortDCB))
{
MessageBox(hMainWnd,TEXT("Unable to configure the serial port"),TEXT("Error"),MB_OK);
dwError=GetLastError();
return FALSE;
}
配置超時值
每次打開通信埠時應用程序都必須用COMMTIMEOUTS結構設置通信超時值。如果不配置這個結構,則埠使用驅動程序提供的預設超時值,或者使用上一個通信應用程序的超時值。通過假定特殊的與實際設置不同的超時設置,應用程序可以執行永遠不能完成的讀/寫操作,或者執行完成過於頻繁的讀/寫操作。
當讀/寫操作發生超時時,操作結束。而且ReadFile和WriteFile函數並不返回錯誤值。若想確定某個操作是否發生了超時,可以驗證實際傳輸的位元組數是否小於請求的位元組數。例如,如果ReadFile函數返回TRUE,但讀的位元組數小於請求的位元組數,則這個操作發生了超時。
配置串列口的超時值
1 調用GetCommTimeouts函數或者手工設置成員來初始化COMMTIMEOUTS結構。
2 用ReadIntervalTimeout成員指定在不發生超時的情況下兩個字元間允許經過的最大毫秒數。
3 用ReadTotalTimeoutMultiplier成員指定讀超時乘子。對於每個讀操作,這個乘子被乘以讀操作期望接收到的位元組數。
4 用ReadTotalTimeoutConstant成員指定讀超時常數。這個成員表示的毫秒數被加到讀取的總位元組數與 ReadTotalTimeoutMultiplier的乘積上。最後得到的結果是讀操作發生超時前必須經過的毫秒數。
5 用WriteTotalTimeoutMultiplier成員指定寫超時乘子。對於每個寫操作,這個乘子被乘以寫操作期望接收的位元組數。
6 用WriteTotalTimeoutConstant成員指定寫超時常數。這個成員表示的毫秒數被加到總位元組數與WriteTotalTimeoutMultiplier的 乘積上。最後得到的結果是寫操作發生超時前必須經過的毫秒數。
7 調用SetCommTimeouts函數激活埠超時設置。
為了有助於多任務處理,通常需要配置COMMTIMEOUTS結構,以便ReadFile函數能夠立即返回讀到的字元。要做到這一點,可以設置ReadIntervalTimeout為MAXWORD,設置ReadTotalTimeoutMultiplier和ReadTotalTimeoutMultiplier為0。
寫串列口
WriteFile函數通過串列連接向另一台設備傳輸數據。調用這個函數之前,應用程序必須打開和配置串列口。
因為Windows CE不支持重疊I/O(也稱為非同步I/O),所以主線程或者任何創建窗口的線程都不應該試圖向串列口寫大量數據。這樣的線程將被阻塞,因而不能管理消息隊列。應用程序可以通過創建多個線程處理讀/寫操作以模擬重疊I/O。為了協調多個線程,應用程序可以調用WaitCommEvent函數阻塞線程,直至發生特定的通信事件。
寫串列口
1 用CreateFile函數返回的句柄。
2 用lpBuffer參數指定要寫的數據的指針。這一數據通常是二進制數據或者字元數據。
3 用nNumberOfBytesToWrite參數指定要寫的字元數。對於基於Windows CE的設備,通常寫一個字元,因為應用程序必須將Unicode 字元轉換為ASCII字元,以便將文本傳輸到串列連接另一端的設備。
4 用lpNumberOfBytesWritten參數指定實際寫的位元組數的指針。WriteFile函數填充這個變數,以便應用程序能夠確定數據是否已 被傳輸。
5 lpOverlapped參數必須是NULL。
讀串列口
ReadFile函數從串列連接另一端的設備獲取數據。參數與WriteFile相同。
通常情況下,讀操作是一個獨立的線程,他總是隨時准備處理到達串列口的數據。通信事件通知讀線程串列口有數據可讀。讀線程通常一次讀一個位元組(每讀一個位元組調用一次ReadFile函數),直至讀完所有數據,然後讀線程等待下一個通信事件。
使用通信事件
通信事件是當發生重要事件時Windows CE向應用程序發送的通知:應用程序可以用WaitCommEvent函數阻塞線程,直至特定事件發生;用SetCommMask函數可以指定繼續處理前必須發生的事件。如果指定了多個事件,則任何一個指定事件的發生將導致WaitCommEvent函數返回。
例如,這種機制使應用程序能夠知道數據何時到達串列口。通過等待表示數據到達的通信事件,應用程序可以避免因調用ReadFile函數等待數據到達而阻塞串列口。只有當有數據可讀時才應該調用ReadFile函數。
事件 描述
EV_BREAK 輸入中發生中斷
EV_CTS CTS信號狀態發生變化
EV_DSR DSR信號狀態發生變化
EV_ERR 發生線路狀態錯誤,線路狀態錯誤包括CE_FRAME,CE_OVERRUN和CE_RXPARITY
EV_RING 檢測到振鈴指示
EV_RLSD 接收線路信號檢測的信號狀態發生變化
EV_RXCHAR 接收到字元,並置於輸入緩沖區中
EV_RXFLAG 接收到事件字元,並置於輸入緩沖區中
EV_TXEMPTY 輸出緩沖區中的最後一個字元已被發送
使用通信事件
1 調用SetCommMask函數指定要查找的事件。
2 調用WaitCommEvent函數,並指定導致這個函數返回的事件。當應用程序指定多個事件時,lpEvtMask參數指向表示導致 WaitCommEvent函數返回的事件的變數。
3 WaitCommEvent函數返回後,循環調用ReadFile函數,直至讀完所有接收到的數據。
4 再次調用SetCommMask函數,指定要查找的事件。
SetCommMask函數通常是應用程序在監視串列口和讀數據的循環中第一個調用的函數。下面的代碼說明了如何將通信事件用於這個目的。
BYTE Byte;
DWORD dwBytesTransferred;
SetCommMask(hPort,EV_RXCHAR|EV_CTS|EV_DSR|EV_RLSD|EV_RING);
while(hPort!=INVALID_HANDLE_VALUE)
{
WaitCommEvent(hPort,&dwCommModemStatus,0);
SetCommMask(hPort,EV_RXCHAR|EV_CTS|EV_DSR|EV_RING);
if(dwCommModemStatus & EV_RXCHAR)
{
do
{
ReadFile(hPort,&Byte,1,&dwBytesTransferred,0);
if(dwBytesTransferred==1)
ProcessChar(Byte);
}while(dwBytesTransferred==1);
}
}
最後關閉串列口
CloseHandle(hPort);