用C++ Builder來編寫串行通信程序, 我們需要用到幾個Windows API函數,而不象在DOS 下那樣直接操作串口和中斷芯片.這幾個函數有OpenFile, CloseFile, GetCommState, SetCommState等,Microsoft的Visual Basic中有一個OCX控件MSComm32,在VB用它做串行通信設備很方便, 將它裝入Builder 3中, 它的Input和Ouput屬性是Unknown, 即 Builder 3不認識MSComm32的這兩個屬性, 我們升級到Borland的C++ Builder 4.0,在 Object Inspector中將不再看到這兩個屬性, 但它們仍然存在, 這兩個屬性的類型是 OleVariant,也就是Ole萬能變量,使用這種類型的方法如下:
在要發送數據時,我們聲明一個發送數據緩沖區,然後重置它的大小,填充它的元 素,發送它,例如:
buff[200]; //請聲明為全局變量
OleVariant TxBuff; //聲明一個OleVariant變量
Txbuff=VarArrayCreat(OPENARRAY(int,(0,n)),varByte); //重置它的大小,為0~n,int為n的類型,varByte為TxBuff每一個元素的類型。
for(int i=0;i<n=1;i++)
Txbuff.PutElement(buf[i],i); //填充元素其中buff為你定義的一個固定數組,其中有你要發的數據
MsComm1->Output=TxBuff; //發送數據,MSComm1為你方在窗體上的一個MSComm32控件。
接收數據時請看下面的例子:
int buff[200]; //聲明一個存儲接收數據的緩沖區,全局變量<br>
int ByteNum; //收到的字節數
int BuffPtr; //接收緩沖區的指針,請聲明為全局變量。
OleVariant RxBuff; //一個用於接收的OleVariant變量。
if(MSComm1-> InBuffCount>0)
RxBuff=Communica1->Input; //如果緩沖區有多於一個字節的數據
ByteNum=RxBuff.ArrayHighBound(1); //將實際讀的字節數取出
for(int i=0;i<=ByteNum;i++)<br>
{
buff[BuffPtr++]=RxBuff.GetElement(i);
}
//將接收數據讀入自己的緩沖區。
在Object Inspector的Event標簽中只有一個事件OnComm, 這個事件在MSComm32控件接收到數據時會被調用,但你必須設置TThreshold屬性,這是一個門檻,表示收到幾 個字節就發送通知消息,如果為零,就不發送通知消息,這樣你的OnComm函數就不會得 到執行,TThreshold是發送門檻,不要忘記Setting。
另外值得注意的是MSComm32的OnComm事件不是很准確,有時會丟失,你不能過分依 賴這個事件,否則,經常發生的不是發不出數據,就是接收不到數據,最好的辦法是使 用一個定時控件,需要的時候就區讀MSComm32控件的緩沖區。