Flutter串口通信插件cr_flutter_libserialport的使用

Flutter串口通信插件cr_flutter_libserialport的使用

flutter_libserialportlibserialport Dart 包的一个简单包装器,利用了 Flutter 的构建系统来在底层构建和部署 libserialport C 库。此包不提供任何额外的 API,但帮助使 libserialport Dart 包在没有手动构建和部署 libserialport C 库的情况下能够正常工作。

支持的平台:

  • Linux
  • macOS
  • Windows
  • Android

使用方法

要使用此包,只需将 flutter_libserialport 添加到你的 pubspec.yaml 文件作为依赖项。

dependencies:
  flutter:
    sdk: flutter
  flutter_libserialport: ^1.0.0 # 请根据实际版本号进行修改

然后运行 flutter packages get 来获取依赖。

以下是一个完整的示例代码,展示了如何使用 flutter_libserialport 插件来列出可用的串口设备。

import 'package:crlibserialport/crlibserialport.dart';
import 'package:flutter/material.dart';

void main() => runApp(ExampleApp());

class ExampleApp extends StatefulWidget {
  [@override](/user/override)
  _ExampleAppState createState() => _ExampleAppState();
}

extension IntToString on int {
  String toHex() => '0x${toRadixString(16)}';
  String toPadded([int width = 3]) => toString().padLeft(width, '0');
  String toTransport() {
    switch (this) {
      case SerialPortTransport.usb:
        return 'USB';
      case SerialPortTransport.bluetooth:
        return 'Bluetooth';
      case SerialPortTransport.native:
        return 'Native';
      default:
        return 'Unknown';
    }
  }
}

class _ExampleAppState extends State<ExampleApp> {
  var availablePorts = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    initPorts();
  }

  void initPorts() {
    setState(() => availablePorts = SerialPort.availablePorts);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter 串口通信示例'),
        ),
        body: Scrollbar(
          child: ListView(
            children: [
              for (final address in availablePorts)
                Builder(builder: (context) {
                  final port = SerialPort(address);
                  return ExpansionTile(
                    title: Text(address),
                    children: [
                      CardListTile('描述', port.description),
                      CardListTile('传输方式', port.transport.toTransport()),
                      CardListTile('USB 总线', port.busNumber?.toPadded()),
                      CardListTile('USB 设备', port.deviceNumber?.toPadded()),
                      CardListTile('供应商ID', port.vendorId?.toHex()),
                      CardListTile('产品ID', port.productId?.toHex()),
                      CardListTile('制造商', port.manufacturer),
                      CardListTile('产品名称', port.productName),
                      CardListTile('序列号', port.serialNumber),
                      CardListTile('MAC 地址', port.macAddress),
                    ],
                  );
                }),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.refresh),
          onPressed: initPorts,
        ),
      ),
    );
  }
}

class CardListTile extends StatelessWidget {
  final String name;
  final String? value;

  CardListTile(this.name, this.value);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(
        title: Text(value ?? 'N/A'),
        subtitle: Text(name),
      ),
    );
  }
}

更多关于Flutter串口通信插件cr_flutter_libserialport的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter串口通信插件cr_flutter_libserialport的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


cr_flutter_libserialport 是一个用于在 Flutter 应用中进行串口通信的插件。它基于 libserialport 库,支持在 Android、iOS、Windows、Linux 和 macOS 平台上进行串口通信。

以下是 cr_flutter_libserialport 的基本使用方法:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 cr_flutter_libserialport 依赖:

dependencies:
  flutter:
    sdk: flutter
  cr_flutter_libserialport: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 cr_flutter_libserialport 插件:

import 'package:cr_flutter_libserialport/cr_flutter_libserialport.dart';

3. 获取可用串口列表

你可以使用 SerialPort.availablePorts 获取当前设备上可用的串口列表:

List<String> ports = SerialPort.availablePorts;
print('Available ports: $ports');

4. 打开串口

使用 SerialPort 类打开一个串口。你需要指定串口的名称、波特率、数据位、停止位和校验位等参数:

SerialPort port = SerialPort('COM1', BaudRate.b9600, DataBits.dataBits8, StopBits.stopBits1, Parity.none);

if (port.open()) {
  print('Port opened successfully');
} else {
  print('Failed to open port');
}

5. 读取和写入数据

你可以使用 port.read()port.write() 方法来进行数据的读取和写入:

// 写入数据
List<int> dataToSend = [0x01, 0x02, 0x03];
port.write(dataToSend);

// 读取数据
List<int> receivedData = port.read(10); // 读取最多 10 个字节
print('Received data: $receivedData');

6. 关闭串口

使用完毕后,记得关闭串口以释放资源:

port.close();
print('Port closed');

7. 监听串口数据

你可以使用 port.onDataReceived 来监听串口接收到的数据:

port.onDataReceived.listen((data) {
  print('Data received: $data');
});

8. 错误处理

在使用过程中,可能会遇到各种错误。你可以使用 port.onError 来监听错误事件:

port.onError.listen((error) {
  print('Error occurred: $error');
});

9. 完整示例

以下是一个完整的示例,展示了如何打开串口、发送数据、接收数据并关闭串口:

import 'package:cr_flutter_libserialport/cr_flutter_libserialport.dart';

void main() async {
  // 获取可用串口列表
  List<String> ports = SerialPort.availablePorts;
  print('Available ports: $ports');

  if (ports.isNotEmpty) {
    // 打开第一个可用串口
    SerialPort port = SerialPort(ports.first, BaudRate.b9600, DataBits.dataBits8, StopBits.stopBits1, Parity.none);

    if (port.open()) {
      print('Port opened successfully');

      // 监听接收到的数据
      port.onDataReceived.listen((data) {
        print('Data received: $data');
      });

      // 发送数据
      List<int> dataToSend = [0x01, 0x02, 0x03];
      port.write(dataToSend);

      // 等待一段时间以接收数据
      await Future.delayed(Duration(seconds: 2));

      // 关闭串口
      port.close();
      print('Port closed');
    } else {
      print('Failed to open port');
    }
  } else {
    print('No available ports');
  }
}
回到顶部