Flutter串口通信插件dart_serial的使用

Flutter串口通信插件dart_serial的使用

在本教程中,我们将学习如何在Flutter应用程序中使用dart_serial插件进行串口通信。该插件旨在支持所有目标平台,并且非常易于使用。

环境准备

首先,确保你已经在你的Flutter项目中添加了dart_serial插件。你需要在项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  dart_serial: ^0.0.1

然后运行flutter pub get以获取新的依赖项。

示例代码

下面是一个简单的示例,演示如何使用dart_serial插件来打开串口、读取数据以及写入数据。

安装与初始化

首先,我们需要初始化串口库。这通常在应用启动时完成。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SerialPortPage(),
    );
  }
}

创建串口页面

接下来,我们创建一个包含串口功能的页面。

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

class _SerialPortPageState extends State<SerialPortPage> {
  SerialPort? _serialPort;
  TextEditingController _textEditingController = TextEditingController();

  // 初始化串口
  void initSerialPort() async {
    _serialPort = SerialPort(
      path: '/dev/ttyUSB0', // 串口路径,根据实际情况修改
      baudRate: 9600, // 波特率
    );

    await _serialPort?.open(); // 打开串口
    if (_serialPort != null && _serialPort!.isOpen) {
      print('串口已打开');
    } else {
      print('串口打开失败');
    }
  }

  // 读取串口数据
  void readSerialData() async {
    while (true) {
      final data = await _serialPort?.read();
      if (data != null) {
        setState(() {
          _textEditingController.text += data;
        });
      }
    }
  }

  // 写入串口数据
  void writeSerialData(String data) async {
    if (_serialPort != null && _serialPort!.isOpen) {
      await _serialPort?.write(data);
    }
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('串口通信示例'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _textEditingController,
              maxLines: 10,
              readOnly: true,
            ),
            SizedBox(height: 20),
            TextField(
              decoration: InputDecoration(hintText: '输入要发送的数据'),
              controller: _textEditingController,
            ),
            ElevatedButton(
              onPressed: () {
                String text = _textEditingController.text;
                writeSerialData(text);
              },
              child: Text('发送数据'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter中使用dart_serial插件进行串口通信可以允许你的应用与硬件设备直接交互。以下是一个基本的代码示例,展示如何在Flutter应用中使用dart_serial插件进行串口通信。

首先,确保你已经在pubspec.yaml文件中添加了dart_serial依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_serial: ^x.y.z  # 替换为最新的版本号

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

接下来,配置你的Android和iOS项目以允许串口通信。这通常涉及修改AndroidManifest.xmlInfo.plist文件。

Android配置

AndroidManifest.xml中,添加以下权限:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

iOS配置

Info.plist中,添加对串口通信的描述(虽然不是必需的,但建议这样做以增加透明度):

<key>NSBluetoothAlwaysUsageDescription</key>
<string>App needs access to bluetooth for serial communication</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App needs access to bluetooth for serial communication</string>

注意:iOS上的串口通信通常涉及更多复杂的配置,具体取决于你的设备和需求。你可能需要查看dart_serial的文档或iOS的官方文档来获取更多信息。

Flutter代码示例

以下是一个基本的Flutter代码示例,展示如何使用dart_serial插件进行串口通信:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SerialCommunicationScreen(),
    );
  }
}

class SerialCommunicationScreen extends StatefulWidget {
  @override
  _SerialCommunicationScreenState createState() => _SerialCommunicationScreenState();
}

class _SerialCommunicationScreenState extends State<SerialCommunicationScreen> {
  SerialPort? _serialPort;
  String _output = "";

  @override
  void initState() {
    super.initState();
    initSerialPort();
  }

  void initSerialPort() async {
    // 替换为你的串口名称和波特率
    var portName = "/dev/ttyUSB0"; // Android示例
    // var portName = "/dev/cu.usbserial-XXXX"; // iOS示例,具体名称需要查看设备管理器
    var baudRate = 9600;

    try {
      _serialPort = await SerialPort.open(portName, baudRate);
      _serialPort!.dataAvailable.listen((Uint8List data) {
        setState(() {
          _output += String.fromCharCodes(data);
        });
      });
      print("Serial port opened successfully.");
    } catch (e) {
      print("Failed to open serial port: $e");
    }
  }

  void sendData(String data) async {
    if (_serialPort != null && _serialPort!.isOpen) {
      _serialPort!.write(data.codeUnits);
    } else {
      print("Serial port is not open.");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Serial Communication"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text("Output:", style: TextStyle(fontWeight: FontWeight.bold)),
            Text(_output, style: TextStyle(fontSize: 16.0)),
            SizedBox(height: 16.0),
            TextField(
              decoration: InputDecoration(labelText: "Send Data"),
              onSubmitted: (value) {
                sendData(value);
              },
            ),
            SizedBox(height: 16.0),
            ElevatedButton(
              onPressed: () {
                if (_serialPort != null) {
                  _serialPort!.close();
                  _serialPort = null;
                  setState(() {
                    _output = "";
                  });
                  print("Serial port closed.");
                }
              },
              child: Text("Close Serial Port"),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _serialPort?.close();
    super.dispose();
  }
}

在这个示例中,我们创建了一个Flutter应用,它尝试打开一个指定的串口,并在接收到数据时更新UI。同时,我们还提供了一个文本字段来发送数据到串口,以及一个按钮来关闭串口连接。

请注意,由于不同设备和操作系统的串口名称和配置可能有所不同,你可能需要根据实际情况调整代码中的串口名称和波特率等参数。此外,还要确保你的应用具有访问串口的必要权限。

回到顶部