前几天遇到公司需求要在Windows 平台开发 一个 项目,因为之前都是基于Android 系统 上开发,所以现在要把 之前Android 系统上的项目移植到 windows 系统上。所以我选择 使用Flutter 开发 兼容多平台方案。
一、选择Flutter 串口通信 插件
flutter_libserialport: ^0.3.0
}
二、集成 串口 导入依赖包并初始化串口
import 'package:flutter_libserialport/flutter_libserialport.dart';
}
三、封装接收串口数据方法(本方法解决了接收数据分包现象)
void _readData() async {
// 读数据
final reader = SerialPortReader(port, timeout: 10);
List<String> list = [];
if (!port.openReadWrite()) {
print(SerialPort.lastError);
return;
}
StringBuffer buffer = StringBuffer();
int timeout = DateTime.now().millisecondsSinceEpoch;
Timer.periodic(Duration(milliseconds: 5), (timer) {
if (list.isNotEmpty) {
int lastTime = DateTime.now().millisecondsSinceEpoch - timeout;
if (lastTime > readTime) {
for (var d in list) {
buffer.write(d.toString());
}
Logger.info('接收数据${buffer.toString()}');
buffer.clear();
list.clear();
}
}
});
reader.stream.listen((data) {
String hexString = data.map((byte) => byte.toRadixString(16)).join();
//print('receivedHex: ${hexString.toUpperCase()}'); // 转换为16进制
list.add(hexString);
timeout = DateTime.now().millisecondsSinceEpoch;
});
//执行接下来的操作
}
四、发送串口数据方法(本方法解决发送黏包现象)
void senData(String sendData) async {
if (sendData.isEmpty) {
return;
}
int lastSendTimeout=DateTime.now().millisecondsSinceEpoch-sendTimeout;
print(lastSendTimeout);
if(lastSendTimeout>sendTime){
List<int> dataList = [];
int len = sendData.length ~/ 2;
for (int i = 0; i < len; i++) {
String data = sendData.trim().substring(2 * i, 2 * (i + 1));
int? d = _hexToInt2(data);
dataList.add(d!);
}
Logger.info('发送数据$sendData');
Logger.info('发送数据${dataList.toString()}');
var bytes = Uint8List.fromList(dataList);
port.write(bytes);
sendTimeout = DateTime.now().millisecondsSinceEpoch;
}
}
五、初始化串口
SerialPortData(this.name) {
print(name);
port = SerialPort(name);
port.config.baudRate = 115200;
port.config.bits = 8;
port.config.parity = 0;
port.config.stopBits = 1;
_readData();
感谢大家支持 有问题请留言