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