1.需要安裝Cport控制元件
2.掃描槍串口引數設定協議
一:串口通訊配置: 115200 8 1 N
二:設備作業引數設定.
資料格式 4 位元組
0X20 0X50 0X01 0X00
引導碼 型別碼 功能碼 引數
0x20 //引導碼
0X50 //型別判斷碼
0X01 功能碼(連續觸發最大次數)
0X00 //連續觸發次數
0X02 功能碼(連續觸發最小次數)
0X00 //連續觸發次數
0X03 功能碼(NG 字串輸出使能)
0X00 //0:NG 字串輸出不使能 1:NG 字串輸出使能
0X04 功能碼(連續掃面間隔時間)
0X00 //連續掃面間隔時間
0X05 功能碼(OK 信號輸出時間)
0X00 //OK 信號輸出時間 一個數為 10MS
0X06 功能碼(NG 信號輸出時間)
0X00 //NG 信號輸出時間 一個數為 10MS
0X07 功能碼(LED 補光燈啟停)
0X00 // 停止 0X01 開啟
0X09 功能碼(全字串匹配啟停)
0X00 //0X00 停止匹配 0X01 啟用匹配
0X0A 功能碼(重復代碼過濾啟停)
0X00 //0X00 停止過濾 0X01 啟用過濾
0X0B 功能碼(比較資料長度)
0X00 //資料長度 1---30 個
0X0C 功能碼(比較資料長度啟停)
0X00 //0X00 停止比較 0X01 啟用比較
0X0D 功能碼(前面部分比較資料字串啟停)
0X00 //0X00 停止比較 0X01 啟用比較
0X0E 功能碼(分割符設定)
0X00 //引數
0X0F//功能碼(網路引數讀取)
0X01 //此位必須為 1
0X16//功能碼(字符觸發設備作業啟停設定)
0X01 0X00 停止 0X01 啟用
0X17//功能碼(字符觸發設備作業超時時間)
0X01 01 表示 100MS 最大 25500MS (0 表示停止超時時間)
0X18//功能碼(多代碼資料過濾啟停設定)
0X01 0X00 停止 0X01 啟用
0X19//功能碼(PC 端串口波特率設定)
0X01 (默認是 115200)
引數設定:
1:9600
2:19200
3:38400
4:57600
5:115200(默認)
6:230400
7:460800
8:921600
0X1A//功能碼(模塊端串口波特率設定)
0X01 (默認是 115200)
引數設定:
1:9600
2:19200
3:38400
4:57600
5:115200(默認)
6:230400
7:460800
8:921600
0X1B 設備觸發啟動命令
0X00//關閉連續作業模式 0X01 打開連續作業模式
0X77 讀取設備全部作業配置引數資訊
0X01//此位必須為 0X01
三:設備作業全字符匹配設定.
0X20 0X60 0X01 0X01
引導碼 型別碼 長度 資料
0X60 全字串匹配設定
0X01 資料長度 1---30 個
0X01 資料
四:設備作業前面部分比較字符匹配設定.
0X20 0X70 0X01 0X01
引導碼 型別碼 長度 資料
0X70 前面部分比較字符
0X01 資料長度 1---30 個
0X01 資料
五:設備字符觸發作業引數設定.
0X20 0XD0 0X01 0X01
引導碼 型別碼 長度 資料
0XD0 字符觸發
0X01 資料長度 1---30 個
0X00 資料(資料里面禁止出現 0X20,否則設備會運行例外!) 六:設備字符觸發停止引數設定.
0X20 0XE0 0X01 0X01
引導碼 型別碼 長度 資料
0XE0 字符觸發
0X01 資料長度 1---30 個
0X00 資料(資料里面禁止出現 0X20,否則設備會運行例外!) 七:設備多代碼起始符和結束符引數設定
0X20 0XF0 0X01 0X01
引導碼 型別碼 長度 資料
型別碼:0XF0(表示起始符)
型別碼:0XF1(表示結束符)
0X01 資料長度 1---30 個
0X00 資料(資料里面禁止出現 0X20,否則設備會運行例外!)
為空時(20 F0 00 00) 八:設備網路引數設定.
0X20 0X80 0X02 0X10 0x01
引導碼 型別碼 長度 指令 引數
0X80 網路引數設定
0X01 資料長度 1---30 個
0x02 長度
0X10 設備模式指令
引數:
0:TCP 服務器模式(默認)
1:TCP 客戶端模式
2:UDP 服務器模式
3:UDP 客戶端模式
0X11 設備 IP 地址指令
引數:
0xC0 192
0xA8 168
0x01 1
0xC8 200
(192.168.1.200)(默認)
0X12 設備子網掩碼指令
引數:
0xFF 255
0xFF 255
0xFF 255
0x00 0
(255.255.255.0)(默認)
0X13 設備網關地址指令
引數:
0xC0 192
0xA8 168
0x01 1
0x01 1
(192.168.1.1)(默認)
0X14 設備埠號指令
引數:
0x07
0xD0
(2000)(默認)
0X15 設備目的 IP 地址指令
引數:
0xC0 192
0xA8 168
0x01 1
0x64 100
(192.168.1.100)(默認)
0X16 設備目的埠號指令
引數:
0x03
0xE8
(1000)(默認)
0X17 設備隨機埠號啟停
引數:
0X00 禁止
0X01 啟用
3.界面設計

界面代碼
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit1, CPort;
type
TForm4 = class(TForm)
btn1: TButton;
grp1: TGroupBox;
edt1: TEdit;
rb2: TRadioButton;
rb1: TRadioButton;
btn3: TButton;
btn2: TButton;
btn4: TButton;
mmo1: TMemo;
lbl1: TLabel;
edt2: TEdit;
btn5: TButton;
btn6: TButton;
btn7: TButton;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btn2Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
procedure btn7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
comm: TComPort;
procedure comRxChar(var of_off: Boolean; var sReadBar_Com: string; count: Integer; i: Integer = 0);
function HexStrTostr(s: string): string; //16進制轉字串
function getComStr(str: string): string; //啟用掃碼槍 回傳掃碼結果
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
//啟用掃碼槍
procedure TForm4.btn1Click(Sender: TObject);
begin
mmo1.Lines.Add(getComStr('ON'));
end;
//初始化掃碼槍
procedure TForm4.btn2Click(Sender: TObject);
begin
// 20500100 //連續觸發最大次數
// 20500200 //連續觸發最小次數
// 20500900 //全字串停止匹配
// 20500A00 //重復代碼停止過濾
// 20500C00 //比較資料長度停止比較
// 20500D00 //前面部分比較資料字串停止比較
// 20500E3B //多代碼分割符設定 ;
// 20600000 //設備作業全字符匹配設定
// 20501800 //多代碼資料過濾啟停設定 停止
// 20700000 //設備作業前面部分比較字符匹配設定
// 20F00000 //設備多代碼起始符和結束符引數設定 F0(表示起始符)
// 20F1013B //設備多代碼起始符和結束符引數設定 F1(表示結束符: ;)
// 20D0024F4E //(開啟掃碼)字符觸發設備作業字符為:ON
// 20E0034F4646 //(停止掃碼)字符觸發設備作業字符為:OFF
// 20500464 //連續掃面間隔時間 1000ms
mmo1.Lines.Add(getComStr(HexStrTostr('20D0024F4E'))); //(開啟掃碼)字符觸發設備作業字符為:ON
mmo1.Lines.Add(getComStr(HexStrTostr('20E0034F4646'))); //(停止掃碼)字符觸發設備作業字符為:OFF
mmo1.Lines.Add(getComStr(HexStrTostr('20500100'))); //連續觸發最大次數
mmo1.Lines.Add(getComStr(HexStrTostr('20500200'))); //連續觸發最小次數
mmo1.Lines.Add(getComStr(HexStrTostr('20500900'))); //全字串停止匹配
mmo1.Lines.Add(getComStr(HexStrTostr('20500A00'))); //重復代碼停止過濾
mmo1.Lines.Add(getComStr(HexStrTostr('20500C00'))); //比較資料長度停止比較
mmo1.Lines.Add(getComStr(HexStrTostr('20500D00'))); //前面部分比較資料字串停止比較
mmo1.Lines.Add(getComStr(HexStrTostr('20500E3B'))); //多代碼分割符設定
mmo1.Lines.Add(getComStr(HexStrTostr('20600000'))); //設備作業全字符匹配設定
mmo1.Lines.Add(getComStr(HexStrTostr('20501800'))); //多代碼資料過濾啟停設定 停止
mmo1.Lines.Add(getComStr(HexStrTostr('20700000'))); //設備作業前面部分比較字符匹配設定
mmo1.Lines.Add(getComStr(HexStrTostr('20F00000'))); //設備多代碼起始符和結束符引數設定 F0(表示起始符)
mmo1.Lines.Add(getComStr(HexStrTostr('20F1013B'))); //設備多代碼起始符和結束符引數設定 F1(表示結束符)
mmo1.Lines.Add(getComStr(HexStrTostr('20500464'))); //連續掃面間隔時間 1000ms
end;
//自定義
procedure TForm4.btn3Click(Sender: TObject);
begin
if edt1.Text = '' then
begin
ShowMessage('請在輸入框里輸入代碼!');
Exit;
end;
if rb2.Checked then
begin
mmo1.Lines.Add(getComStr(edt1.Text));
end
else
begin
mmo1.Lines.Add(getComStr(HexStrTostr(edt1.Text)));
end;
end;
//查看掃碼槍配置
procedure TForm4.btn4Click(Sender: TObject);
begin
mmo1.Lines.Add(getComStr(HexStrTostr('20507701')));
end;
//設定掃碼個數
procedure TForm4.btn5Click(Sender: TObject);
var
i: Integer;
begin
//掃碼個數 沒有輸入數值停止運行
if edt2.Text = '' then Exit;
i := StrToInt(edt2.Text);
if (i < 10) and (i > 0) then
begin
// 20500100 連續觸發最大次數 0 次
// 20500200 連續觸發最小次數 0 次
mmo1.Lines.Add(getComStr(HexStrTostr('2050010' + edt2.Text)));
mmo1.Lines.Add(getComStr(HexStrTostr('2050020' + edt2.Text)))
end
else if (i > 10) and (i > 0) then
begin
mmo1.Lines.Add(getComStr(HexStrTostr('205001' + edt2.Text)));
mmo1.Lines.Add(getComStr(HexStrTostr('205002' + edt2.Text)))
end;
end;
procedure TForm4.btn6Click(Sender: TObject);
begin
mmo1.Clear;
end;
//連接掃碼槍
procedure TForm4.btn7Click(Sender: TObject);
begin
comm.Port := 'COM1';
comm.BaudRate := br115200; //波特率
comm.DataBits := dbEight; //資料位
comm.StopBits := sbOneStopBit; //停止位
comm.Parity.Bits := prNone; //校驗位 流控制
comm.ShowSetupDialog;
comm.Open;
end;
procedure TForm4.comRxChar(var of_off: Boolean; var sReadBar_Com: string; count, i: Integer);
var
sBrf: ansistring;
AsyncPtr: PAsync;
BB: Integer;
begin
InitAsync(AsyncPtr);
try
comm.ReadStrAsync(sBrf, count, AsyncPtr);
BB := comm.WaitForAsync(AsyncPtr);
SetLength(sBrf, BB);
if (i = 0) or (i > 0) then //i用來記錄sbrf長度
begin
i := Length(sBrf);
of_off := False;
Sleep(100); //等待100ms
end;
if (i > 0) and (i = Length(sBrf)) then //當i長度 等于sBrf的長度 表示已經讀取完了
begin
sReadBar_Com := sReadBar_Com + sBrf;
of_off := True;
end;
finally
DoneAsync(AsyncPtr);
end;
end;
//關閉視窗
procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//comm.Free; //注釋的原因:正在關閉視窗時還在運行控制掃碼 ,會提示沒有連接
end;
//表單創建是初始化 comm 介面
procedure TForm4.FormCreate(Sender: TObject);
begin
comm := TComPort.Create(nil);
end;
//啟用掃碼槍 回傳掃碼結果
function TForm4.getComStr(str: string): string;
var
of_off: Boolean;
sReadBar_Com: string;
count, I: Integer;
begin
comm.WriteStr(str);
sReadBar_Com := '';
for I := 0 to 50 do //重復讀出次數限定為50次
begin
Application.ProcessMessages;
comRxChar(of_off, sReadBar_Com, count);
if of_off then
Break;
end;
Result := sReadBar_Com;
end;
//16進制轉字串
function TForm4.HexStrTostr(s: string): string;
var
t: Integer;
ts: string;
M, Code: Integer;
begin
t := 1;
Result := '';
while t <= Length(s) do
begin
while (t <= Length(s)) and (not CharInSet(s[t], ['0'..'9', 'A'..'F', 'a'..'f'])) do
inc(t);
if (t + 1 > Length(s)) or (not CharInSet(s[t + 1], ['0'..'9', 'A'..'F', 'a'..'f'])) then
ts := '$' + s[t]
else
ts := '$' + s[t] + s[t + 1];
Val(ts, M, Code);
if Code = 0 then
Result := Result + Chr(M);
inc(t, 2);
end;
end;
end.
--------------------------------------------------------------------------------------------------
unit1.pas 代碼
unit Unit1;
interface
uses CPort;
type
BarcodeScanner=class
public
com:TComPort;
constructor Create();
function getStr(str:string):string;
function comRxChar(ok_off:Boolean;i:Integer=0):string;
end;
implementation
{ barcodeScanner }
function BarcodeScanner.comRxChar(ok_off: Boolean; i: Integer): string;
var
str:string;
count:Integer;
begin
com.ReadStr(str,count);
if (i=0) or (i<>0) then
begin
i:=Length(str);
ok_off:=False;
end
else if (i<>0) and (Length(str)=i) then
begin
i:=Length(str);
ok_off:=True;
end;
Result:=str;
end;
constructor barcodeScanner.Create();
begin
com:=TComPort.Create(nil);
com.Port := 'COM3';
com.BaudRate := br115200; //波特率
com.DataBits := dbEight; //資料位
com.StopBits := sbOneStopBit; //停止位
com.Parity.Bits := prNone; //校驗位 流控制
com.Open;
end;
function BarcodeScanner.getStr(str: string): string;
var
of_off:Boolean;
str1:string;
begin
com.WriteStr(str);
while True do
begin
str1:= comRxChar(of_off);
if of_off then Break;
end;
Result:=str1+'1';
end;
end.
uj5u.com熱心網友回復:
以此代碼可用,謝謝轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265732.html
標籤:語言基礎/算法/系統設計
上一篇:打開Delphi10.2版本出現了“Access violation at address .....求大神指點”
下一篇:THTTPRIO 驗證問題
