Lazarus 跨 windows, linux, solaris, freebsd, android, ios, macOS,一次写代码可编译成在arm, x86 等CPU结构运行的程序,体积不大,所以安装起来很方便。需要串口的话,在Package下面点选online package,然后在站点上找相应的 package 安装。
1. LazSerial 包
它是串口通讯用的,类似spcomm和mscomm的功能。
把它放在 Form 上,默认是 LazSerial1,属性设置里有波特率等参数设置,没什么特殊的就略过了。
打开串口 LazSerial1.Active := True; , 也可以读它的属性 if LazSerial1.Active = True then begin ...... end;
关闭串口 LazSerial1.Active := False;
如果使用的是USB-RS232串口,建议将打开串口放在try ... except ... end; 的try下面,防止有时串口线没插而运行程序时出错。
2. 发送进制指令
以简单的 modbus 指令来说吧, 比如 01 03 01 00 00 28 44 28 , 是读设备数据指令, 44 28 是01 03 01 00 00 28 的CRC校验值(可自编函数计算,此处略)。
LazSerial的ASCII写指令 Writeln 好用,但发送上面的 byte 指令不好用,换一个。
Var btSend: array[0..7] of Byte;
btSend[0]:= $01;
btSend[1]:= $03;
btSend[2]:= $01;
btSend[3]:= $00;
btSend[4]:= $00;
btSend[5]:= $28;
btSend[6]:= $44;
btSend[7]:= $28;
上面的 byte 数组赋值后, 用 WriteBuffer 一次性将所有 bytes 发出去。
Form1.LazSerial1.WriteBuffer(btSend, 8);
3. 接收二进制数据
LazSerial的ASCII读指令 Readln 好用,但发送接受上面的 byte 指令返回值不好用,换一个。
LazSerial 组件的 Event 里有 OnRxData ,把它启用了生成个Procedure
procedure TForm1.LazSerial1RxData(Sender: TObject);
在这个Procedure里面接收数据,用下面的指令。
Form1.LazSerial1.SynSer.RecvByte(0);
RecvByte是LazSerial定义的,0是指Timeout值。
设备每返回一个字节就接收一个字,把接收到的加在一起就是返回的全部字节。
我说一下自己体会的要点,
大家都是高手,还要虚心向大家学习!