轉自網址:http://blog.csdn.net/henhen2002/article/details/4485158
經驗。(串口部分),相信不少的人都知道在VB中有一個控件MSComm(圖標是一個小黃電話),它可以幫你完成普通的串口傳輸功能(比如字符串什么的,但有的卻實現起來比較煩瑣),
在BCB中要用VB的控件,我想很多人都知道怎么辦,在菜單中點Component——>Import ActiveX Control在打開的框中找到你想要的Microsoft Comm Control6.0然后直接安裝就可以了,注意,前提是你必須要裝了VB或者有它的庫,否則你可找不到的然后你就可以在組件板的Activex中看到一個小黃電話的圖標了。
它是不可見的控件,它有不少屬性,不過我認為最關鍵的幾個屬性就是
CommPort---設置或返回通訊端口號。
Settings---以字符串形式設置或返回波特率、奇偶校驗、數據位和停止位。
PortOpen---設置或返回通訊端口的狀態,以及打開和關閉端口(BOOL型)。
Input---從接收緩沖區返回和刪除字符。
Output---向緩沖區寫一個字符串。
這五個屬性就可以幫你完成簡單的串口傳送接收(當然,你要保證你的傳、收的可靠性,你還需要借助其他的屬性,這些屬性可以在VB中得到)下邊我將介紹一下怎么來用這個控件,以及在程序中怎么組織程序。首先,你要建立一個新的工程,然后把MSComm控件放到窗體上,別忘了再放一個Button控件(Name屬性就是Button1)。好了,雙擊Button1,得到如下:
(請注意:本例的工程文件為Project1.bpr窗體文件為Unit.cpp頭文件為Unit.h)
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString buff[10]; //****************************聲明了一個緩沖,請注意,一定要設置為全局變量
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) 在此加入程序代碼
{
MSComm1->CommPort=1;
MSComm1->Settings="9600,N,8,1";
MSComm1->PortOpen=true;
for(int i=0;i<=9;i++)
{
buff[i]=i;
MSComm1->Output=buff[i];
}
MSComm1->PortOpen=false;
}
//---------------------------------------------------------------------------
運行此程序,當你點擊按鈕后,會發送數據(你可以在網上下載一個測試串口通訊的軟件)
下面,我來解釋一下上邊的程序:
MSComm1->CommPort=1;這句程序是用來確定你將用哪一個串口實行你的通訊傳輸,我在這里選擇是串口1(你也可以選擇串口2,不過如果串口2不能用的話,系統會給你提示)
MSComm1->Settings="9600,N,8,1";這句程序是用來設置污七雜八的東東的,我在程序中設置的波特率為9600,N為無奇偶校驗,數據位為8,停止位為1。
MSComm1->PortOpen=true表示將你設置好的串口1打開(false為關閉串口)接着我用了一個循環語句,也就是i從0到9這十個數分別放到您所定義的緩沖區內(buff[10]),這個緩沖的大小是由你自己來決定,再次提醒,必須為全局變量。
MSComm1->Output=buff[i];就是將數據發送出去。
MSComm1->PortOpen=false;最后別忘了將串口1關閉就行,這就完成了傳的工作,我在這里所講的都是最簡單的應用,不過萬變不離其蹤,您需要怎么傳您就怎么做就可以了:)
我想說的還有MSComm的Output屬性后邊要求必須是Olevariant的,用這個控件在傳送過程中其實傳送的都是AnsiString,對於一般的傳送要求都可以滿足了,但是對於有着特殊要求的傳送,VB的這個控件可是愛莫能助的。比如要傳送八進制、十六進制的數據,用這個方法傳送的數據是錯誤的。
因為當你無論是用C語言中的0X還是用BCB中的IntToHex()將數據轉化為十六進制的數據,但傳送出去的實際數據卻是不正確的。那么怎么辦呢?我想最有效的方法還是來借助API函數幫助我們,這很有效的。下面我來介紹一下我借助API函數實現十六進制數據的傳送。【注意】
//---------------------------------------------------------------------------
第二次.用VB的MSComm控件我實現不了對十六進制數據的傳送,於是,我就借助了API函數,很多人都知道在API函數中有這么兩個函數CreareFile和WriteFile
至於這兩個函數的具體東西,大家在實際應用中去查一下就行,我不多說了。
首先還是請您創建一個工程(我所做的例子都未對新建的.bpr和.cpp文件名做任何修改),在窗體上放上Button控件,雙擊,在里邊按如下形式加如代碼即可。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hCom=CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hCom)
{
DCB dcb;
ZeroMemory(&dcb,sizeof(dcb));
dcb.DCBlength=sizeof(dcb);
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
if(SetCommState(hCom,&dcb))
{
DWORD ByteCount;
int *msg;
int a[6]= {'4',4, 'A',A,30, '0'}
for(msg=a;msg<(a+10);msg++)
WriteFile(hCom,msg,1,&ByteCount,NULL);
}
CloseHandle(hCom);
}
}
關於兩個函數的參數到底是怎么用的,大家可以很方便的就能查到,我只想請您注意在定義指針時一定要細心些,否則你可能產生錯誤,上邊的程序只是完成了傳送了一個十六進制的F0,
如果你要傳送字符串,那么你把程序稍加改動即可。例如發送HELLO,我給出程序
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hCom = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL );
if(hCom)
{
DCB dcb;
ZeroMemory(&dcb, sizeof(dcb));
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if(SetCommState(hCom,&dcb))
{
DWORD ByteCount;
const char *msg = "HELLO";
WriteFile(hCom,msg, strlen(msg),&ByteCount,NULL);
}
CloseHandle(hCom);
}
}
請同志們把兩個程序比較一下,其實很多東西就會明白的。
好了,關於串口通訊的我就講這么多,當然這只是個皮毛,而且對於接收數據我沒有提到,我想明白了發送,接收程序對於大家也不會是什么困難的事情。具體的應用還要看你們實際中的要求,要求變了,程序當然要變,不變的就是原理。通過這次所做的串口通訊程序,有了以上的一些心得,拿來與大家共同討論,也是為了感謝象抱雪這樣同志,為我們大家創造了交流的機會。希望我的心得能對大家有所幫助。
