本文介绍如何通过flutter_libserialport插件在Flutter中实现串口通信调试。
1、引入依赖
在flutter工程的pubspec.yaml文件中引入flutter_libserialport依赖:
dependencies:
flutter_libserialport: ^0.3.0
2、导入import依赖包
在dart代码中import导入flutter_libserialport.dart就可以使用了。
import 'package:flutter_libserialport/flutter_libserialport.dart';
3、读取所有串口设备
通过SerialPort.availablePorts方法可以获取当前的所有串口。以下代码用于打印所有的串口名称。
// 串口测试
void serialTest() {
print('Available ports:');
var i = 0;
List<String> list = SerialPort.availablePorts;
print('PortSize: ${list.length}');
for (final name in SerialPort.availablePorts) {
print('${++i}) $name');
}
}
也可以通过以下代码读取设备串口的详情信息并打印出来。
// 串口测试
void serialTest() {
print('Available ports:');
var i = 0;
List<String> list = SerialPort.availablePorts;
print('PortSize: ${list.length}');
for (final name in SerialPort.availablePorts) {
final sp = SerialPort(name);
print('${++i}) $name');
print('\tDescription: ${sp.description}');
print('\tManufacturer: ${sp.manufacturer}');
print('\tSerial Number: ${sp.serialNumber}');
print('\tProduct ID: 0x${sp.productId!.toRadixString(16)}');
print('\tVendor ID: 0x${sp.vendorId!.toRadixString(16)}');
sp.dispose();
}
}
4、监听并接收串口数据
通过SerialPortReader可以创建一个输入流用于接收发送到串口的数据。
// 串口测试
void serialTest() {
String name = '/dev/ttyS4';
final port = SerialPort(name);
// port.config.baudRate = 115200;
if (!port.openReadWrite()) {
print(SerialPort.lastError);
return;
}
// 读数据
final reader = SerialPortReader(port);
reader.stream.listen((data) {
print('received: $data');
print('receivedString: ${utf8.decode(data)}'); // 转换为字符串
String hexString = data.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join();
print('receivedHex: ${hexString.toUpperCase()}'); // 转换为16进制
});
}
1、默认接收的数据是Uint8List类型即二进制格式。
2、我们可以通过utf8.decode(data)方法将接收到的Uint8List数据转换为字符串。
3、也可以通过data.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join()方法将接收到的Uint8List数据转换成16进制。
5、通过串口发送数据
通过调用write方法可以直接向串口发送数据,需要注意的是数据类型是Uint8List。
// 串口测试
void serialTest() {
// 写数据
var bytes = Uint8List.fromList([0xAB, 0xCD, 0xEF]);
port.write(bytes);
}
6、代码示例
在flutter中实现串口通信调试的完整代码示例如下:
// 串口测试
void serialTest() {
print('Available ports:');
var i = 0;
List<String> list = SerialPort.availablePorts;
print('PortSize: ${list.length}');
for (final name in SerialPort.availablePorts) {
// final sp = SerialPort(name);
print('${++i}) $name');
// print('\tDescription: ${sp.description}');
// print('\tManufacturer: ${sp.manufacturer}');
// print('\tSerial Number: ${sp.serialNumber}');
// print('\tProduct ID: 0x${sp.productId!.toRadixString(16)}');
// print('\tVendor ID: 0x${sp.vendorId!.toRadixString(16)}');
// sp.dispose();
}
String name = '/dev/ttyS4';
final port = SerialPort(name);
// port.config.baudRate = 115200;
if (!port.openReadWrite()) {
print(SerialPort.lastError);
return;
}
// 读数据
final reader = SerialPortReader(port);
reader.stream.listen((data) {
print('received: $data');
print('receivedString: ${utf8.decode(data)}'); // 转换为字符串
String hexString = data.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join();
print('receivedHex: ${hexString.toUpperCase()}'); // 转换为16进制
});
// 写数据
var bytes = Uint8List.fromList([0xAB, 0xCD, 0xEF]);
port.write(bytes);
}
新时代农民工