我无法读取串行端口,我尝试了flutter_libserialport
文档中的多个片段,但没有运气。
我使用的是esp32,我在串行端口上发送一些数据,使用这个微Python代码:
from time import sleep
while True:
print('{"firmware_type": "keypad", "value": 2}')
sleep(1)
字符串
我的dart函数是:
void readSerialData() async {
SerialPort port = SerialPort("/dev/cu.wchusbserial55390119721");
final config = SerialPortConfig();
config.baudRate = 115200;
port.config = config;
SerialPortReader reader = SerialPortReader(port, timeout: 10000);
int bufferIndex = 0;
Stream<Uint8List> upcomingData = reader.stream.map((data) {
return data;
});
try {
port.openReadWrite();
List<int> buffer = [];
upcomingData.listen((data) {
buffer.addAll(data);
bufferIndex += data.length;
debugPrint('Raw data: $data');
if (bufferIndex >= 5) {
String strBuffer = String.fromCharCodes(buffer);
debugPrint('Buffer: $strBuffer');
bufferIndex = 0;
buffer = [];
}
});
} on SerialPortError catch (err, _) {
debugPrint('SerialPortError: $err');
port.close();
} finally {
}
}
型
我的输出是:
flutter: Raw data: [101, 39, 58, 32, 50, 125, 13, 10, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32, 39, 118, 97, 108, 117, 101, 39, 58, 32, 50, 125, 13, 10, 123, 39, 102, 105, 114, 109, 119, 97, 114, 101, 95, 116, 121, 112, 101, 39, 58, 32, 39, 107, 101, 121, 112, 97, 100, 39, 44, 32]
flutter: Buffer: e': 2}
flutter: 'keypad', 'value': 2}
flutter: {'firmware{'firmware_type': 'keypad', 'value': 2}
flutter: {'firmware_type': 'keypad', 'value': 2}
flutter: {'firmware_type': 'keypad', 'value': 2}
flutter: {'firmware_type': 'keypad',
lutter: {'firmware_type': 'keypad',
flutter: Raw data: [226, 161, 134]
flutter: Raw data: [196, 200, 30, 255]
flutter: Raw data: [167, 134, 158]
flutter: Raw data: [248, 240, 78, 255]
flutter: Raw data: [196, 132, 230]
flutter: Raw data: [238, 140]
flutter: Raw data: [255]
flutter: Raw data: [244, 232, 94, 255]
flutter: Raw data: [196, 132, 204]
flutter: Raw data: [242, 161, 134]
flutter: Raw data: [130, 33, 134]
flutter: Raw data: [249, 245, 66, 255]
flutter: Raw data: [196, 132, 204]
flutter: Raw data: [242, 129, 134]
flutter: Buffer: â¡�ÄÈ�ÿ§��øðNÿÄ�æî�ÿôè^ÿÄ�Ìò¡��!�ùõBÿÄ�Ìò��
flutter: Raw data: [238, 12, 63, 255]
flutter: Raw data: [249, 245, 66, 255]
flutter: Raw data: [74, 225, 249]
...
型
它似乎是阅读正确的数据在某个点,但然后是不工作了.因为它的工作有时我猜是无关的波特率,也我可以读它以及在Arduino串行监视器我的猜测是,它要么是不匹配的缓冲区大小或新行字符'\n',但我不知道如何解决.
2条答案
按热度按时间vsmadaxz1#
为了确保您的串行数据实际上是完整的,使用像Putty或Tera-Term这样的终端来打开comport并查看数据。如果数据在终端中也损坏了,那么您可能与esp 32的连接不好,所以一定要检查一下。如果您有esp 32的副本,可能有一个便宜的<->USB转换器,它可能是罪魁祸首。
如果终端工作正常,请确保在dart代码中完全设置串行端口;如文档所示:SerialPortConfig class
在使用端口之前,您应该始终配置所有设置。库没有应用默认设置。当您打开端口时,它可能具有操作系统或驱动程序的默认设置,或者最后一个使用它的程序遗留的设置。[...]您应该始终设置波特率,数据位,奇偶校验和停止位。
所以一定要这样做。
zhte4eai2#
正如我在之前的评论中提到的,问题并不是我的esp32没有发送任何东西。我可以用其他方式读取串行端口的输出,而不是使用flutter。问题是关于这里详细描述的一个可能的bug:https://github.com/jpnurmi/libserialport.dart/issues/24解决方法是首先从串行端口复制现有的配置,然后更改它,然后将副本分配回串行端口:
字符串
还有一个变通办法,这不是一个选择,我是使用较低的波特率(9600)。