VC 的串列埠通訊

2021-04-12 19:22:48 字數 4674 閱讀 6723

vc++ 的串列埠通訊

vc++ 的串列埠通訊

代翔在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++訪問串列埠。

在vc++中,串列埠和磁碟檔案可以統一的方式來簡單讀寫。這兩者幾乎沒有什麼不

同,只是在windows 9x下磁碟檔案只能做同步訪問,而串列埠只能做非同步訪問。

createfile:用指定的方式開啟指定的串列埠。通常的方式為

m_hcom = createfile( "com1", generic_read | generic_write, 0, null,

m_hcom為檔案控制代碼。generic_read | generic_write指定可以對串列埠進行讀

寫操作。第三個引數0表示串列埠為獨佔開啟。open_existing表示當指定串列埠不存在

量。readfile:讀取串列埠資料。

writefile:向串列埠寫資料。

closehandle:關閉串列埠。

commtimeouts:commtimeouts主要用於串列埠超時引數設定。

commtimeouts結構如下:

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 )

{if( m_bopened ) return( true );

char szport[15];

dcb dcb;

wsprintf( szport, "com%d", nport );

m_hcomdev = createfile( szport, generic_read | generic_write, 0, null,

commtimeouts commtimeouts;

commtimeouts.readintervaltimeout = 0xffffffff;

commtimeouts.readtotaltimeoutmultiplier = 0;

commtimeouts.readtotaltimeoutconstant = 0;

commtimeouts.writetotaltimeoutmultiplier = 0;

commtimeouts.writetotaltimeoutconstant = 5000;

setcommtimeouts( m_hcomdev, &commtimeouts );

m_bopened = true;

return m_bopened;

int cserial::inbuffercount( void )

{if( !m_bopened || m_hcomdev == null ) return( 0 );

dword dwerrorflags;

comstat comstat;

clearcommerror( m_hidcomdev, &dwerrorflags, &comstat );

return (int)comstat.cbinque;

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

{if( !m_bopened || m_hcomdev == null ) return 0;

bool breadstatus;

dword dwerrorflags;

comstat comstat;

clearcommerror( m_hcomdev, &dwerrorflags, &comstat );

if( !comstat.cbinque ) return 0;

dwbytesread = min(dwbytesread,(dword) comstat.cbinque);

breadstatus = readfile( m_hcomdev, buffer, dwbytesread, &dwbytesread,

return dwbytesread;

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

{if( !m_bopened || m_hcomdev == null ) return( 0 );

bool bwritestat;

bwritestat = writefile( m_hcomdev, buffer, dwbyteswritten, &dwbyteswritten,

上述函式基本實現串列埠的開啟,讀寫操作。本文章略去該串列埠類的說明和關閉函

數。讀者應該能將這些內容寫完。接下來,你就可以在你的程式中呼叫該串列埠類了。

VC 的串列埠通訊

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

VC 的串列埠通訊

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

VC 的串列埠通訊

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