VC 的串列埠通訊

2021-09-30 07:40:44 字數 2917 閱讀 8938

在vc++中有兩種方法可以進行串列埠通訊。一種是利用microsoft公司提供的activex控制項 microsoft communications control。另一種是直接用vc++訪問串列埠。下面將簡述這兩種方法。

一、microsoft communications control

microsoft公司在windows中提供了乙個串列埠通訊控制項,用它,我們可以很簡單的利用串列埠進行通訊。在使用它之前,應將控制項加在應用程式的對話方塊上。然後再用classwizard 生成相應的物件。現在我們可以使用它了。

該控制項有很多自己的屬性,你可以通過它的屬性視窗來設定,也可以用程式設定。我推薦用程式設定,這樣更靈活。

setcommport:指定使用的串列埠。

getcommport:得到當前使用的串列埠。

setsettings:指定串列埠的引數。一般設為預設引數"9600,n,8,1"。這樣方便與其他串列埠進行通訊。

getsettings:取得串列埠引數。

setportopen:開啟或關閉串列埠,當乙個程式開啟串列埠時,另外的程式將無法使用該串列埠。

getportopen:取得串列埠狀態。

getinbuffercount:輸入緩衝區中接受到的字元數。

setinputlen:一次讀取輸入緩衝區的字元數。設定為0時,程式將讀取緩衝區的全部字元。

getinput:讀取輸入緩衝區。

getoutbuffercount:輸出緩衝區中待傳送的字元數。

setoutput:寫入輸出緩衝區。

一般而言,使用上述函式和屬性就可以進行串列埠通訊了。以下是乙個範例。

#define messagelength 100

class cmydialog : public cdialog

bool cmydialog::oninitdialog()

return true;

}

void cmydialog::ontimer(uint nidevent)

cdialog::ontimer(nidevent);

}

用該控制項傳輸的資料是unicode格式。關於unicode和ansi的關係和轉換請參看msdn。

關於該控制項的其他詳細資料請檢視msdn關於comm control部分。

二、直接用vc++訪問串列埠。

typedef struct _commtimeouts commtimeouts,*lpcommtimeouts;

readintervaltimeout:兩字元之間最大的延時,當讀取串列埠資料時,一旦兩個字元傳輸的時間差超過該時間,讀取函式將返回現有的資料。設定為0表示該引數不起作用。

readtotaltimeoutmultiplier:讀取每字元間的超時。

readtotaltimeoutconstant:一次讀取串列埠資料的固定超時。所以在一次讀取串列埠的操作中,其超時為readtotaltimeoutmultiplier乘以讀取的位元組數再加上 readtotaltimeoutconstant。將readintervaltimeout設定為maxdword,並將readtotaltimeoutmultiplier 和readtotaltimeoutconstant設定為0,表示讀取操作將立即返回存放在輸入緩衝區的字元。

writetotaltimeoutmultiplier:寫入每字元間的超時。

writetotaltimeoutconstant:一次寫入串列埠資料的固定超時。所以在一次寫入串列埠的操作中,其超時為writetotaltimeoutmultiplier乘以寫入的位元組數再加上 writetotaltimeoutconstant。

setcommtimeouts函式可以設定某裝置控制代碼的超時引數,要得到某裝置控制代碼的超時引數可以用getcommtimeouts函式。

dcb:dcb結構主要用於串列埠引數設定。該結構太龐大,這裡就不一一講述了,有興趣者可檢視msdn關於dcb的描述。其中下面兩個是比較重要的屬性。

baudrate:串列埠的通訊速度。一般設定為9600。

bytesize:位元組位數。一般設定為8。

dcb結構可以用setcommstate函式來設定,並可以用getcommstate來得到現有串列埠的屬性。

setupcomm:設定串列埠輸入、輸出緩衝區。

internal,internalhigh是保留給系統使用的,使用者不需要設定。

offset,offsethigh是讀寫串列埠的偏移量,一般設定offsethigh為null,可以支援2gb資料。

hevent讀寫事件,因為串列埠是非同步通訊,操作可能被其他程序堵塞,程式可以通過檢查該時間來得知是否讀寫完畢。事件將在讀寫完成後,自動設定為有效。

通過以上這些函式和結構,我們就可以通過串列埠進行通訊了,現在我們具體看下面的例項:

bool cserial::open( int nport, int nbaud )

int cserial::inbuffercount( void )

dword cserial::readdata( void *buffer, dword dwbytesread)

dword cserial::senddata( const char *buffer, dword dwbyteswritten)

VC 的串列埠通訊

vc 的串列埠通訊 vc 的串列埠通訊 代翔在vc 中有兩種方法可以進行串列埠通訊。一種是利用microsoft公司提供的activex 控制項 microsoft communications control。另一種是直接用vc 訪問串列埠。下面將簡述 這兩種方法。一 microsoft comm...

VC 的串列埠通訊

在vc 中有兩種方法可以進行串列埠通訊。一種是利用microsoft公司提供的activex控制項 microsoft communications control。另一種是直接用vc 訪問串列埠。下面將簡述這兩種方法。一 microsoft communications control micro...

VC 的串列埠通訊

在vc 中有兩種方法可以進行串列埠通訊。一種是利用microsoft公司提供的activex控制項 microsoft communications control。另一種是直接用vc 訪問串列埠。下面將簡述這兩種方法。一 microsoft communications control micro...