VC 串列埠通訊

2022-11-23 09:42:01 字數 3871 閱讀 9635

代翔在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,

open_existing, file_attribute_normal | file_flag_overlapped, null );

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

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

時,程式將返回失敗。 file_attribute_normal | file_flag_overlapped則表

示檔案屬性。當開啟串列埠時,必須指定 file_flag_overlapped,它表示檔案或設

備不會維護訪問指標,則在讀寫時,必須使用overlapped 結構指定訪問的檔案偏移

量。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:設定串列埠輸入、輸出緩衝區。

overlapped:儲存串列埠非同步通訊的資訊。具體結構如下:

typedef struct _overlapped overlapped;

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,

open_existing, file_attribute_normal | file_flag_overlapped, null );

if( m_hcomdev == null ) return( false );

memset( &m_overlappedread, 0, sizeof( overlapped ) );

memset( &m_overlappedwrite, 0, sizeof( overlapped ) );

commtimeouts commtimeouts;

= 0xffffffff;

= 0;

= 0;

= 0;

= 5000;

VB串列埠通訊例程

現有電子秤一台,使用串列埠與計算機進行通訊。編寫vb程式來訪問串列埠,達到讀取電子秤上顯示的資料。該電子秤為be01型儀表,輸出為rs 232c標準介面,波特率為300 9600 偶校驗 7個資料位 2個停止位。所有字元均傳送11位ascii碼,乙個起始位。在vb中與串列埠通訊需要引入控制項msco...

TG串列埠通訊協議

tg 串列埠通訊協議 咸陽機場 微控制器與計算機均以11位元組為一包進行傳送資料微控制器快取 30h 3ah 50h 5ah 40h 4ah 62h 67h 功能位 命令上傳 a z,50h 5ah 命令下傳 a z 30h 3ah 開始位用中括號 結束位用中括號 微控制器上傳命令格式 微控制器下傳...

232 485串列埠通訊詳解

串列埠通訊詳解 一 rs 232 rs 232在1962年發布,命名為eia 232 e,作為工業標準,以保證不同廠家產品之間的相容。rs 232 c是美國電子工業協會eia electronic industry association 制定的一種序列物理介面標準。rs是英文 推薦標準 的縮寫,2...