串口接收、发送数据OK
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);