?? unit1.pas
字號:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OleCtrls, MSCommLib_TLB, ExtCtrls, StdCtrls, ComCtrls, Db, ADODB;
type
TMainForm = class(TForm)
MSComm: TMSComm;
tmrSend: TTimer;
cmbbxComNum: TComboBox;
cmbbxBaud: TComboBox;
cmbbxDataNum: TComboBox;
cmbbxStopBit: TComboBox;
cmbbxCheckBit: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
btnSerial: TButton;
chckbxTimer: TCheckBox;
btnSend: TButton;
edtTime: TEdit;
Label6: TLabel;
shpSerial: TShape;
Label7: TLabel;
Button1: TButton;
Label48: TLabel;
Label49: TLabel;
Label50: TLabel;
ListView1: TListView;
Label13: TLabel;
ADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure btnSerialClick(Sender: TObject);
procedure chckbxTimerClick(Sender: TObject);
procedure MSCommComm(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure tmrSendTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
HexShow:Boolean;
HexSend:Boolean;
SendNumber:integer;
HaveShow:integer;
e2:string;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses Unit2, Unit3, Unit4, Unit5;
{$R *.DFM}
function hex(c:char):Integer ;
var
x:integer;
begin
if c=' ' then
x:=0
else if (Ord(c)>=ord('0')) and (Ord(c)<=ord('9')) then
x:=Ord(c)-Ord('0')
else if (Ord(c)>=ord('a')) and (Ord(c)<=ord('f')) then
x:=Ord(c)-Ord('a')+10
else if (Ord(c)>=ord('A')) and (Ord(c)<=ord('F')) then
x:=Ord(c)-Ord('A')+10
else
//輸入錯誤
x:=-1;
Result:=x;
end;
//該函數接收1個至2個字符
//轉換成功.輸出對應16進制數的值
//轉換失敗.輸出-1。
function HexToInt(S:String): Integer;
var
tmpInt1,tmpInt2:Integer ;
begin
if Length(S)=1 then
begin
Result:=hex(S[1]);
end
else if Length(S)=2 then
begin
tmpInt1:=hex(S[1]);
tmpInt2:=hex(S[2]);
if (tmpInt1=-1) or (tmpInt2=-1) then
Result:=-1
else
Result:= tmpInt1*16+tmpInt2;
end
else
//輸入錯誤,轉換失敗
Result:=-1;
end;
//該函數接收4個字符
//轉換成功.輸出對應10進制數的值
//轉換失敗.輸出-1。
function HexStrToInt(S:String): Integer;
var
tmpInt1,tmpInt2,tmpInt3,tmpInt4:Integer ;
begin
tmpInt1:=hex(S[1]);
tmpInt2:=hex(S[2]);
tmpInt3:=hex(S[3]);
tmpInt4:=hex(S[4]);
if (tmpInt1=-1) or (tmpInt2=-1) or (tmpInt3=-1) or (tmpInt4=-1)then
Result:=-1
else
Result:= tmpInt1*16*16*16+tmpInt2*16*16+tmpInt3*16+tmpInt4;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
cmbbxComNum.ItemIndex:=1;
shpSerial.Brush.Color:=clWhite;
MSComm.InputMode:=1;
HexShow:=True;
HexSend:=True;
SendNumber:=1;
HaveShow:=0;
end;
procedure TMainForm.btnSerialClick(Sender: TObject);
var
ComSetting:String;
begin
if not MSComm.PortOpen then
begin
//打開串口
MSComm.CommPort :=cmbbxComNum.ItemIndex +1;
//默認值為 '4800,N,8,1'
ComSetting:=cmbbxBaud.Text;
ComSetting:=ComSetting+','+cmbbxCheckBit.Text;
ComSetting:=ComSetting+','+cmbbxDataNum.Text;
ComSetting:=ComSetting+','+cmbbxStopBit.Text;
MSComm.Settings:=ComSetting;
MSComm.PortOpen:=True;
//變換各個組件的狀態
shpSerial.Brush.Color:=clRed; //指示燈變紅
btnSerial.Caption :='關閉串口';
end
else begin
//關閉串口
//變換各個組件的狀態
MSComm.PortOpen:=False;
shpSerial.Brush.Color:=clWhite;//指示燈變白
btnSerial.Caption :='打開串口';
end;
end;
procedure TMainForm.chckbxTimerClick(Sender: TObject);
begin
if chckbxTimer.Checked then
begin
tmrSend.Interval:=StrToInt(edtTime.Text);
tmrSend.Enabled:=True;
btnSend.Enabled:=False;
end
else begin
tmrSend.Enabled:=False;
btnSend.Enabled:=True;
end;
end;
procedure TMainForm.MSCommComm(Sender: TObject);
var
i,InputLen:Integer;
tmpInt:Integer;
tmpvar:Variant;
InputString:String;
tmpstr:String;
listitem:TListItem;
strSQL,e1,e3,e4,e5,e6,e7,e8,e9:string;
begin
if MSComm.CommEvent=ComEvReceive then
begin
InputLen:=MSComm.InBufferCount;
//接收二進制數據,轉換為十六進制顯示
if HexShow then
begin
tmpvar:=MSComm.Input;
InputString:='';
for i:= 0 to InputLen-1 do
begin
tmpInt:=tmpvar[i];
InputString:=InputString+''+LowerCase(IntToHex(tmpInt,2));
end;
end
//直接接收字符
else begin
InputString:=MSComm.Input;
end;
if (Copy(InputString,5,4)='4545') then
begin
SendNumber:=1;
end;
if SendNumber=2 then
begin
e2:='遼'+UpperCase(Copy(InputString,6,1)+Copy(InputString,8,1)
+Copy(InputString,10,1)+Copy(InputString,12,1)
+Copy(InputString,14,1)+Copy(InputString,16,1)
+Copy(InputString,18,1));
Label50.Caption := e2;
end;
if SendNumber=3 then
begin
//Label9.Caption:= '金額 : '+FloatToStr(StrToInt(Copy(InputString,5,6))/10)+'元 ';
//Label10.Caption:= '行駛里程:'+ FloatToStr(StrToInt(Copy(InputString,11,6))/10)+'公里 ';
//Label12.Caption:= '載客行駛里程:'+FloatToStr(StrToInt(Copy(InputString,17,6))/10)+'公里 ';
//Label17.Caption:= '侯時:'+ IntToStr(StrToInt(Copy(InputString,23,4)))+'小時'+
//IntToStr(StrToInt(Copy(InputString,27,2)))+'分 ';
end;
if SendNumber=4 then
begin
if HaveShow=0 then
begin
//Label52.Caption:= '金額 : '+FloatToStr(StrToInt(Copy(InputString,5,8))/10)+'元 ';
//Label53.Caption:='行駛里程:'+ FloatToStr(StrToInt(Copy(InputString,13,8))/10)+'公里 ';
//Label54.Caption:='載客行駛里程:'+FloatToStr(StrToInt(Copy(InputString,21,8))/10)+'公里 ';
//Label55.Caption:= '侯時:'+IntToStr(StrToInt(Copy(InputString,29,4)))+'小時'+
//IntToStr(StrToInt(Copy(InputString,33,2)))+'分 ';
HaveShow:=1;
end;
end;
if SendNumber=5 then
begin
listitem:=ListView1.Items.Add;
e1:= IntToStr(HexStrToInt(Copy(InputString,39,4)));
listitem.Caption:= e1;
//e3:= '20'+Copy(InputString,37,2)+'.'
//+ IntToStr(StrToInt(Copy(InputString,5,2)))
//+ '.'+ IntToStr(StrToInt(Copy(InputString,7,2)));
e3:= '20'+Copy(InputString,37,2)+Copy(InputString,5,2)+Copy(InputString,7,2);
listitem.SubItems.Add(e3);
e4:= IntToStr(StrToInt(Copy(InputString,9,2)))+':'+
IntToStr(StrToInt(Copy(InputString,11,2)));
listitem.SubItems.Add(e4);
e5:= IntToStr(StrToInt(Copy(InputString,33,2)))+':'+
IntToStr(StrToInt(Copy(InputString,35,2)));
listitem.SubItems.Add(e5);
e6:= IntToStr(StrToInt(Copy(InputString,21,2)))+':'+
IntToStr(StrToInt(Copy(InputString,23,2)));
listitem.SubItems.Add(e6);
e7:= FloatToStr(StrToInt(Copy(InputString,13,4))/100);
listitem.SubItems.Add(e7);
e8:= FloatToStr(StrToInt(Copy(InputString,17,4))/10);
listitem.SubItems.Add(e8);
e9:= FloatToStr(StrToInt(Copy(InputString,27,6))/100);
listitem.SubItems.Add(e9);
strSQL:='insert into yyjl values('''+e1+''','''+e2+''', '''+e3+''','''+e4+''','''+e5+''','''+e6+''','''+e7+''','''+e8+''','''+e9+''')';
with TADOQuery.Create(nil) do
begin
try
Close;
Connection:=MainForm.ADOConnection1;
SQL.Clear;
SQL.Add(strSQL);
ExecSQL;
finally
Free;
end;
end;
end;
end
end;
procedure TMainForm.btnSendClick(Sender: TObject);
var
Len:Integer;
i,count,tmpInt:Integer;
tmpVar:Variant;
tmpStr,Output:String;
begin
if not MSComm.PortOpen then
begin
showmessage('沒有打開串口!');
Exit;
end
else begin
//發送二進制數,需要使用Variant變量矩陣,矩陣大小自動調節
if HexSend then
begin
if SendNumber=1 then
begin
Output:='f1';
MSComm.RThreshold:=10;
end
else if SendNumber=4 then
begin
Output:='f2';
MSComm.RThreshold:=23;
end
else if SendNumber=2 then
begin
Output:='f5';
MSComm.RThreshold:=21;
end
else if SendNumber=3 then
begin
Output:='f6';
MSComm.RThreshold:=21;
end
else SendNumber:=4;
Len:=Length(Output);
if Len>0 then
begin
i:=1;
count:=1;
//創建一個Variant數組
tmpVar:=VarArrayCreate([1,1],varByte);
while(i<Len) do
begin
//每3個字符串中截取2個字符,轉換為16進制
tmpStr:=Copy(Output,i,2);
tmpStr:=LowerCase(tmpStr);
tmpInt:=HexToInt(tmpStr);
if tmpInt=-1 then
begin
showmessage('發送的數據格式有問題!');
exit;
end
else begin
tmpVar[Count]:=tmpInt;
Inc(count);
//增大Variant數組
VarArrayRedim(tmpVar,count);
end;
i:=i+3;
end;
MSComm.Output :=tmpVar;
SendNumber:=SendNumber+1;
end;
end
end;
end;
procedure TMainForm.tmrSendTimer(Sender: TObject);
begin
if MSComm.PortOpen then
btnSendClick(sender);
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
Form2.show;
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
Form3.show;
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin
Form4.show;
end;
procedure TMainForm.Button5Click(Sender: TObject);
begin
Form5.show;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -