unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, CPort, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
mmo1: TMemo;
tmr1: TTimer;
ComPort: TComPort;
mmo2: TMemo;
procedure tmr1Timer(Sender: TObject);
procedure ComPort1RxChar(Sender: TObject; Count: Integer);
procedure TsData(const str: string);
procedure btn1Click(Sender: TObject);
private
FData:string;
FNewDate:Double;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function HexStrToStr(const S:string):string;
var
t:Integer;
ts:string;
M,Code:Integer;
begin
t:=1;
Result:='';
while t<=Length(S) do
begin
while not (S[t] in ['0'..'9','A'..'F','a'..'f']) do
inc(t);
if (t+1>Length(S))or(not (S[t+1] in ['0'..'9','A'..'F','a'..'f'])) then
ts:='$'+S[t]
else
ts:='$'+S[t]+S[t+1];
Val(ts,M,Code); // 把16进制字符串转换成十进制数12h->18
if Code=0 then //转换成功
begin
Result:=Result+Chr(M);//返回指定ascII值的字符 chr(18)->#$12
end; //s=1234567 -> result=#$12'3V'#7
inc(t,2);
end;
end;
function StrToHexStr(const S:string):string;
//字符串转换成16进制字符串
var
I:Integer;
begin
for I:=1 to Length(S) do
begin
if I=1 then
Result:=IntToHex(Ord(S[1]),2)
else Result:=Result+' '+IntToHex(Ord(S[I]),2);
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
if ComPort.Connected then
ComPort.Close
else ComPort.Open;
end;
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
S:string;
I,J:Integer;
M:Byte;
begin
ComPort.ReadStr(S,Count);
for I:=1 to Count do
mmo1.Text:=mmo1.Text+StrToHexStr(S);
for I:=1 to Count do
begin
M:=ord(s[I]);
if s[I]='255' then
begin
FNewDate:=StrToFloat(s[I+1]);
FNewDate:=FNewDate+StrToInt(s[I+2])*256;
FNewDate:=FNewDate*0.000057;
FData:=FData+floattostr(FNewDate);
mmo2.Text := Mmo2.Text + FData;
end;
end;
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
TsData('F0');
end;
procedure TForm1.TsData(const str: string);
var
ss:string;
begin
if Comport.Connected then //串口打开时发送相应数据到输出缓冲区
begin
ss:=HexStrToStr(Str);
Comport.WriteStr(ss); //写缓冲区
end;
end;连接串口后会出现unable to open com port
请问是不是代码哪里错了。
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, CPort, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
mmo1: TMemo;
tmr1: TTimer;
ComPort: TComPort;
mmo2: TMemo;
procedure tmr1Timer(Sender: TObject);
procedure ComPort1RxChar(Sender: TObject; Count: Integer);
procedure TsData(const str: string);
procedure btn1Click(Sender: TObject);
private
FData:string;
FNewDate:Double;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function HexStrToStr(const S:string):string;
var
t:Integer;
ts:string;
M,Code:Integer;
begin
t:=1;
Result:='';
while t<=Length(S) do
begin
while not (S[t] in ['0'..'9','A'..'F','a'..'f']) do
inc(t);
if (t+1>Length(S))or(not (S[t+1] in ['0'..'9','A'..'F','a'..'f'])) then
ts:='$'+S[t]
else
ts:='$'+S[t]+S[t+1];
Val(ts,M,Code); // 把16进制字符串转换成十进制数12h->18
if Code=0 then //转换成功
begin
Result:=Result+Chr(M);//返回指定ascII值的字符 chr(18)->#$12
end; //s=1234567 -> result=#$12'3V'#7
inc(t,2);
end;
end;
function StrToHexStr(const S:string):string;
//字符串转换成16进制字符串
var
I:Integer;
begin
for I:=1 to Length(S) do
begin
if I=1 then
Result:=IntToHex(Ord(S[1]),2)
else Result:=Result+' '+IntToHex(Ord(S[I]),2);
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
if ComPort.Connected then
ComPort.Close
else ComPort.Open;
end;
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
S:string;
I,J:Integer;
M:Byte;
begin
ComPort.ReadStr(S,Count);
for I:=1 to Count do
mmo1.Text:=mmo1.Text+StrToHexStr(S);
for I:=1 to Count do
begin
M:=ord(s[I]);
if s[I]='255' then
begin
FNewDate:=StrToFloat(s[I+1]);
FNewDate:=FNewDate+StrToInt(s[I+2])*256;
FNewDate:=FNewDate*0.000057;
FData:=FData+floattostr(FNewDate);
mmo2.Text := Mmo2.Text + FData;
end;
end;
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
TsData('F0');
end;
procedure TForm1.TsData(const str: string);
var
ss:string;
begin
if Comport.Connected then //串口打开时发送相应数据到输出缓冲区
begin
ss:=HexStrToStr(Str);
Comport.WriteStr(ss); //写缓冲区
end;
end;连接串口后会出现unable to open com port
请问是不是代码哪里错了。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货