|
用C++ Builder來(lái)編寫串行通信程序,我們需要用到幾個(gè)Windows API函數(shù)而不像在DOS下那樣直接操作串口和中斷芯片。這幾個(gè)函數(shù)有OpenFile、CloseFile,GetCommState、SetCommState等。Microsoft的Visual Basic 中有一個(gè)OCX控件MSComm32,在VB中用它做串行通信程序很方便,將它裝入Builder 3中,它的Input和Output屬性是UnKnown,即Builder 3不認(rèn)識(shí)MSComm32的這兩個(gè)屬性。升級(jí)到Borland 的C++ Builder4.0,在Object Inspector中將不再看到這兩個(gè)屬性,但它們?nèi)匀淮嬖,這兩個(gè)屬性的類型是OleVariant。使用這種類型方法如下:
在要發(fā)送數(shù)據(jù)時(shí),我們聲明一個(gè)發(fā)送數(shù)據(jù)緩沖區(qū),然后重置它的大小,填充它的元素,發(fā)送它,例如:
unsigned char buff[200];//請(qǐng)聲明為全局變量,應(yīng)該是動(dòng)態(tài)數(shù)組,否則會(huì)出現(xiàn)亂碼
OleVariant TxBuff;//聲明一個(gè)OleVariant 變量
TxBuff=VarArrayCreate(OPENARRAY(int,(0,200)),varByte);//重置它的大小,為0~n,int 為n的類型。
。痸arByte為TxBuff每一個(gè)元素的類型。 for(int i=0;ibr<200+1;i++)TxBuff.PutElement(buff[i],i);
。畛湓,其中buff為你定義的一個(gè)固定數(shù)組,其中有你要發(fā)的數(shù)據(jù)。
MSComm1->Output=TxBuff;//發(fā)送數(shù)據(jù),MSComm1為你放在窗體上的一個(gè)MSComm32控件。
按收數(shù)據(jù)時(shí)請(qǐng)看下面的例子:
unsigned char buff[200];//聲明一個(gè)存儲(chǔ)接收數(shù)據(jù)的緩沖區(qū),全局變量
int ByteNum;//收到的字節(jié)數(shù)
int BuffPtr;//接收緩沖區(qū)的指針,請(qǐng)聲明為全局變量,
OleVariant RxBuff;//一個(gè)用于接收的OleVariant變量,
if(MSComm1->InBufferCount>0)RxBuff=Communica1->Input;//如果緩沖區(qū)中有多于一個(gè)字節(jié)的數(shù)據(jù)
ByteNum=RxBuff.ArrayHighBound(1);//將實(shí)際讀的字節(jié)數(shù)取出 for(int i=0;ibr<ByteNum+1;i++) {buff[BuffPtr++]=RxBuff.GetElement(i);}//將接收數(shù)據(jù)讀入自己的緩沖區(qū)>
在Object Inspector的Event標(biāo)簽中只有一個(gè)事件OnComm,這個(gè)事件在MSComm32控件收到數(shù)據(jù)時(shí)會(huì)被調(diào)用,但你必須設(shè)置RThreshold屬性。這是一個(gè)門檻,表示收到幾個(gè)字節(jié)就發(fā)送通知消息,如果為零,就不發(fā)送通知消息,這樣你的OnComm函數(shù)就不會(huì)得到執(zhí)行,TThreshold是發(fā)送門檻,不要忘記Settings。
另外值得注意的是MSComm32的OnComm事件不是很準(zhǔn)確,有時(shí)候會(huì)丟失,你不能過(guò)分依賴這個(gè)事件,否則,經(jīng)常發(fā)生的不是發(fā)不出數(shù)據(jù),就是接收不到數(shù)據(jù),最好的辦法是使用一個(gè)定時(shí)控件,需要的時(shí)候就去讀MSComm32控件的緩沖區(qū)。 |