串口接收、发送数据OK

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//接收数据

procedure TFrm_m1ReceiveData(Sender: TObject;

Buffer: PAnsiChar; BufferLength: Word);

var i:integer;

rbuf,sbuf:array[1..21] of byte;

tmpstr,tmphex,tmpview:string;

begin

tmpstr:='';

tmphex:='';

move(buffer^,pchar(@rbuf)^,bufferlength);

for i:=1 to BufferLength do

begin

tmpstr:=tmpstr+char(rbuf[i]); //字符型

tmphex:=tmphex+inttohex(rbuf[i],2); //16进制型

end;

if trim(tmpstr)<>'' then

viewstring:=viewstring+tmpstr;

if tmphex='0A' then

begin

//Memo1.Lines.Add(viewstring);

if Edit1.Text<>viewstring then

Edit1.Text:=viewstring;

viewstring:='';

end;

end;

//发送数据

procedure senddata;

var

i:integer;

commflg:boolean;

begin

viewstring:='';

commflg:=true;

for i:=1 to high(sbuf) do

begin

if not m1.writecommdata(@sbuf[i],1) then

begin

commflg:=false;

break;

end;

//发送时字节间的延时

sleep(5);

viewstring:=viewstring+inttohex(sbuf[i],2)+' ';

if not commflg then messagedlg('发送失败!',mterror,[mbyes],0);

end;

viewstring:='发送'+viewstring;

Form1.memo1.lines.add(viewstring);

Form1.memo1.lines.add('');

end;

procedure TForm1.sentcustom();

var str11:string ;

i,j,k:integer;

tmpstr:string;

begin

if Edit1.Text<>'' then

begin

str11:=Trimplace(Edit1.Text); //替换字符串中的所有空格

i:=round(length(str11)/2); //获得字符串长度,除2取整后加1

setlength(sbuf,i+1); //重新设定发送数组范围

for j:=1 to i do

begin

tmpstr:=copy(str11,j*2-1,2);

if tmpstr='' then

tmpstr:='00';

sbuf[j]:=byte(strtoint('$'+tmpstr)); //将变量转换为byte数组end;

end

else

begin

sbuf[1]:=byte($53); //帧头

sbuf[2]:=byte($54);

sbuf[3]:=byte($2C);

sbuf[4]:=byte($47);

sbuf[5]:=byte($53);

sbuf[6]:=byte($2C);

sbuf[7]:=byte($2B);

sbuf[8]:=byte($20);

sbuf[9]:=byte($20);

sbuf[10]:=byte($20);

sbuf[11]:=byte($30);

sbuf[12]:=byte($2E);

sbuf[13]:=byte($30);

sbuf[14]:=byte($30);

sbuf[15]:=byte($20);

sbuf[16]:=byte($6B);

sbuf[17]:=byte($67);

sbuf[18]:=byte($20);

sbuf[19]:=byte($20);

sbuf[20]:=byte($0D);

sbuf[21]:=byte($0A);

end;

end;

var

Form1: TForm1;

viewstring:string;

rbuf,sbuf:array of byte;

implementation

{$R *.dfm}

//此处用于自动获取系统的串口数目以及名称,调用api函数实现相关功能procedure EnumComPorts(Ports: TStrings);

var

KeyHandle: HKEY;

ErrCode, Index: Integer;

ValueName, Data: string;

ValueLen, DataLen, ValueType: DWORD;

TmpPorts: TStringList;

begin

ErrCode := RegOpenKeyEx(

HKEY_LOCAL_MACHINE,

'HARDWARE\DEVICEMAP\SERIALCOMM',

0,

KEY_READ,

KeyHandle);

if ErrCode <> ERROR_SUCCESS then

Exit; // raise EComPort.Create(CError_RegError, ErrCode);

TmpPorts := TStringList.Create;

try

Index := 0;

repeat

V alueLen := 256;

DataLen := 256;

SetLength(ValueName, ValueLen);

SetLength(Data, DataLen);

ErrCode := RegEnumValue(

KeyHandle,

Index,

PChar(ValueName),

Cardinal(ValueLen),

nil,

@ValueType,

PByte(PChar(Data)),

@DataLen);

if ErrCode = ERROR_SUCCESS then

begin

SetLength(Data, DataLen);

TmpPorts.Add(Data);

Inc(Index);

end

else

if ErrCode <> ERROR_NO_MORE_ITEMS then

exit; //raise EComPort.Create(CError_RegError, ErrCode);

until (ErrCode <> ERROR_SUCCESS) ;

TmpPorts.Sort;

Ports.Assign(TmpPorts);

finally

RegCloseKey(KeyHandle);

TmpPorts.Free;

end;

end;

procedure TForm1.SetComPort();

begin

//获取计算机中的串口列表,并设置电子秤的串口号

EnumComPorts(ComboBox1.Items);

if ComboBox1.Items.Count>0 then

begin

ComboBox1.ItemIndex:=0; //ComboBox1.Items.Count-1;

mName:=ComboBox1.Text;

//Comm1.StopComm; //打开之前先关闭串口

//Comm1.StartComm; //打开串口;

if Comm1.PortOpen=true then

Label1.Caption:='串口状态:'+ComboBox1.Text+'串口已打开'

else

Label1.Caption:='串口状态:'+ComboBox1.Text+'串口已关闭'

//上面可使用循环向各个串口接收或发送数据来判断电子秤的串口号end

else

begin

Label1.Caption:='串口状态:'+ComboBox1.Text+'串口已关闭';

end;

//showmessage(inttostr(ComboBoxComList.Items.Count));

end;

//替换字符串中的空格函数

function Trimplace(str: string): string;

var

tmp: string;

p : Integer;

begin

tmp := Trim(str);

相关文档
最新文档