小弟在測驗用mscomm控制元件時,碰到問題如下:
1、接收的全部長度不能固定,但每個回傳點的長度是固定的11個,如只有一個點就是回傳11個,有2個點就是22個。。。
2、我希望的是對這個回傳的值進行判斷,如果接收到指定的11個值時就進行一次動作(讀記憶體地址)并顯示在EDIT里面,也有可能同時接收的長度是11、33、55個,此間的時時間非常短,如反回值是O(00.111.1)讀地址A,反回值是O(00.112.1),讀地址B。同時可能反回值是O(00.111.1)O(00.112.1)O(00.113.1)O(00.114.1),怎么樣才能單獨判斷并執行讀地址?
寫的代碼如下:
begin
with MSComm1 do
begin
CommPort:=3; //使用Com3
Settings:='9600,n,8,1'; //設定通信口引數
InputLen:=0; //設定Input一次從接受緩沖區讀取全部位元組
InBufferCount:=0; //清除接受緩沖區
OutBufferCount:=0; //清除發送緩沖區
InBufferSize:=512; //設定發送緩沖區為2位元組
RThreshold:=11; //設定接受11個位元組就產生OnComm事件
InputMode:=ComInputModeText; // 設定接受資料模式為二進制方式
PortOpen:=True;
end;
if MSComm1.CommEvent = comEvReceive then //接受事件 //這里是不是應該用回圈來查
sleep(20);
begin
buffer:=MSComm1.Input; //讀取接受到的資料
sTemp:=buffer;
edt26.Text:=stemp+',';
{
if label1.Caption = 'I(00,017,1)' THEN
begin
label2.Caption:='檢測到信號';
label2.Color:= clyellow;
end
else
begin
label2.Caption:='未檢測到信號';
label2.Color:= cllime;
end;
end;
}
end;
麻煩各位能給出完整代碼,并講解關鍵部分,謝謝
uj5u.com熱心網友回復:
不打明白你描述的,接收資料的處理,就是按照協議來。建議用CPORT控制元件
uj5u.com熱心網友回復:
看不出難在哪里, 不就是一些基本的字串處理嗎uj5u.com熱心網友回復:
資料正常呀,對字串進行分段處理。uj5u.com熱心網友回復:
你要建立Com口資料的資料池(緩沖),這樣,你可以定時截取資料了。uj5u.com熱心網友回復:
是我沒有說明白,每個信號進來的時候完整的輸出是 I(00,001,1)或者 I(00,001,0),代表001接識訓斷開;因為在以毫秒為單位的情情況下同時會有好幾個信號進來,每個信號都是11個字符長度,如果在取001接識訓斷開的同時002的信號也進來了,那么就會導致信號不完整 如:I(00,001,1這里還沒有讀完 時I(00,002,1)也發送到了快取區那么格式將不完整,正常是I(00,001,1)I(00,002,1) ,取出來的是I(00,001,I(00,002,1),我改為 if pos('017,1',label1.caption) ,能取出來,但是效果也不太理想,取出來的地址誤差還是非常大(地址完全正確)。uj5u.com熱心網友回復:
詳細設定與代碼如下:with MSComm1 do
begin
CommPort:=3; //使用Com3
Settings:='9600,n,8,1'; //設定通信口引數
InputLen:=0; //設定Input一次從接受緩沖區讀取全部位元組
InBufferCount:=0; //清除接受緩沖區
OutBufferCount:=0; //清除發送緩沖區
InBufferSize:=512; //設定發送緩沖區為2位元組
RThreshold:=11; //設定接受11個位元組就產生OnComm事件
InputMode:=ComInputModeText; // 設定接受資料模式為二進制方式
PortOpen:=True;
end;
end;
procedure TForm1.tmr2Timer(Sender: TObject);
begin
dengzt:= myini.ReadString('LIGHT','LIGHT','');
if dengzt = 'GREEN' then
begin
if Pos('006,0',edt26.Text) > 0 then
begin
readprocessmemory(jb,pointer($7F6B4064),@cunfaz,SizeOf(cunfaz),shijiz);
edt6.Text:=floattostr(integer(cunfaz)/1000);
edt6.Color:=clYellow;
end
else if Pos('006,1',edt26.Text) > 0 then
begin
edt6.Color:=clBtnFace;
end ;
end;
end;
procedure TForm1.tmr3Timer(Sender: TObject);
begin
dengzt:= myini.ReadString('LIGHT','LIGHT','');
if dengzt = 'GREEN' then
begin
if Pos('007,0',edt26.Text) > 0 then
begin
readprocessmemory(jb,pointer($7F6B4064),@cunfaz,SizeOf(cunfaz),shijiz);
edt7.Text:=floattostr(integer(cunfaz)/1000);
edt7.Color:=clYellow;
end
else if Pos('007,1',edt26.Text) > 0 then
begin
edt7.Color:=clBtnFace;
end;
end;
end;
procedure TForm1.tmr4Timer(Sender: TObject);
begin
dengzt:= myini.ReadString('LIGHT','LIGHT','');
if dengzt = 'GREEN' then
begin
if Pos('008,0',edt26.Text) > 0 then
begin
readprocessmemory(jb,pointer($7F6B4064),@cunfaz,SizeOf(cunfaz),shijiz);
edt8.Text:=floattostr(integer(cunfaz)/1000);
edt8.Color:=clYellow;
end
else if Pos('008,1',edt26.Text) > 0 then
begin
edt8.Color:=clBtnFace;
end;
end;
end;
end.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/60227.html
標籤:VCL組件開發及應用
