?? mscomm的完整應(yīng)用例子.txt
字號(hào):
用MSCOMM涉及到OleVariant和Variant變量,而結(jié)構(gòu)TVarData直接映射了這兩者,OleVariant
與Variant的區(qū)別僅僅在于前者只支持OLE類型變量.TVarData結(jié)構(gòu)的定義在System單元內(nèi).
以下是MSCOMM的具體用法:
MSComm控件的主要屬性及事件
(1)CommPort:設(shè)置或返回串行端口號(hào),缺省值1。
(2)Setting:設(shè)置或返回串口通信參數(shù),格式為“波特率,奇偶校驗(yàn)位,數(shù)據(jù)位,
停止位”。例如:MSComm1.Setting:=′9600,n,8,1′
(3)PortOpen:打開或關(guān)閉串行端口,格式為:MSComm1.PortOpen:={True|False}
(4)InBufferSize:設(shè)置或返回接收緩沖區(qū)的大小,缺省值為1024字節(jié)。
(5)InBufferCount:返回接收緩沖區(qū)內(nèi)等待讀取的字節(jié)數(shù),可通過(guò)設(shè)置該屬性為0來(lái)
清空接收緩沖區(qū)。
(6)RThreshold:該屬性為一閥值,它確定當(dāng)接收緩沖區(qū)內(nèi)的字節(jié)個(gè)數(shù)達(dá)到或超過(guò)該
值后就產(chǎn)生代碼為ComEvReceive的OnComm事件。
(7)SThreshold:該屬性為一閥值,它確定當(dāng)發(fā)送緩沖區(qū)內(nèi)的字節(jié)個(gè)數(shù)少于該值后就
產(chǎn)生代碼為ComEvSend的OnComm事件。
(8)InputLen:設(shè)置或返回接收緩沖區(qū)內(nèi)用Input讀入的字節(jié)數(shù),設(shè)置該屬性為0表示
Input讀取整個(gè)緩沖區(qū)的內(nèi)容。
(9)Input:從接收緩沖區(qū)讀取一串字符。
(10)OutBufferSize:設(shè)置或返回發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié)。
(11)OutBufferCount:返回發(fā)送緩沖區(qū)內(nèi)等待發(fā)送的字節(jié)數(shù),可通過(guò)設(shè)置該屬性為0
來(lái)清空緩沖區(qū)。
(12)OutPut:向發(fā)送緩沖區(qū)傳送一串字符。
如果在通信過(guò)程中發(fā)生錯(cuò)誤或事件,就會(huì)觸發(fā)OnComm事件,并由CommEvent屬性代碼反映錯(cuò)誤類型,在通信程序的設(shè)計(jì)中可根據(jù)該屬性值來(lái)執(zhí)行不同的操作。CommEvent屬性值及其含義如下:
(1)ComEvSend:值為1,發(fā)送緩沖區(qū)的內(nèi)容少于SThreshold指定的值。
(2)ComEvReceive:值為2,接收緩沖區(qū)內(nèi)字符數(shù)達(dá)到RThreshold指定的值。
(3)ComEvFrame:值為1004,硬件檢測(cè)到幀錯(cuò)誤。
(4)ComEvRxOver:值為1008,接收緩沖區(qū)溢出。
(5)ComEvTxFull:值為1010,發(fā)送緩沖區(qū)溢出。
(6)ComEvRxParity:值為1009,奇偶校驗(yàn)錯(cuò)誤。
(7)ComEvEOF:值為7,接收數(shù)據(jù)中出現(xiàn)文件尾(ASCII碼為26)字符。
type
TByteArray = array[0..99]of Byte;
PByteArray = ^TByteArray;
procedure TForm1.FormCreate(Sender: TObject);
begin
//串口初始化
MSComm.CommPort := 1; //COM1
MSComm.Setting:= '9600,n,8,1';//波特率9600,數(shù)據(jù)位8位,無(wú)奇偶校驗(yàn),停止位1位
MSComm.InBufferCount := 0; //清空接收緩沖區(qū)
MSComm.InputLen := 0; //讀取整個(gè)緩沖區(qū)內(nèi)容
MSComm.InBufferSize := 1024; //接收緩沖區(qū)1024個(gè)字節(jié)
MSComm.RThreshold := 100; //每次接收到100個(gè)字節(jié)即產(chǎn)生OnComm事件
MSComm.OutBufferCount := 0; //清空發(fā)送緩沖區(qū)
MSComm.OutBufferSize := 512; //發(fā)送緩沖區(qū)512個(gè)字節(jié)
MSComm.SThreshold := 1; //每次發(fā)送緩沖區(qū)字節(jié)數(shù)少于1個(gè)即產(chǎn)生OnComm事件
if not MSComm.PortOpen then //打開串口
MSComm.PortOpen := True;
end;
procedure TForm1.MSCommComm(Sender: TObject);
var
ovRec: OleVariant; //MSCOMM接收的數(shù)據(jù)
baVal: TByteArray; //接收數(shù)組,這里假設(shè)每次接收100個(gè)數(shù)據(jù)
s: PByteArray;
i: Integer;
begin
if MSComm.ComEvent=ComEvReceive then
begin
ovRec := MSComm.Input;
s := TVarData(ovRec).VPointer;
for i:=0 to 99 do
baVal[i] := s^[i];
end;
end;
procedure TForm1.Transmit(baVal: TByteArray); //發(fā)送數(shù)據(jù)主程序
var
ovSend: OleVariant;
begin
TVarData(ovSend).VPointer := @baVal;
if not MSComm.PortOpen then //打開串口
MSComm.PortOpen := True;
MSComm.Output := ovSend;
end;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -