Flutter:如何在Android中实现串口通信调试

        本文介绍如何通过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);
}

新时代农民工

猜你喜欢

转载自blog.csdn.net/sg_knight/article/details/130781257