应该是单行的 ORSSerialPort 数据来自多行

ORSSerialPort data that should be a single line is coming in over multiple lines

我有一个 arduino,它每半秒在串行线上吐出一行 GPS 数据,我知道这是有效的,因为我可以查看 arduino IDE 中的串行监视器并且每半秒, 出现新的单行数据。

我现在正在使用 Swift 编写一个 Mac 程序,该程序将每个坐标都放在地图上,因为它是通过串行端口输入的,并且我正在使用 ORSSerialPort 库来连接到 arduino 并接收它的数据。这工作正常,我有一个基本版本早些时候工作,但是我注意到 GPS 数据中存在差距(它们以小组形式出现在地图上,在应该是常数的时候之间有一个明显的 space他们一行)。

在我得到地图之前,我有一个文本字段,它会在输入时添加每条 GPS 数据线,它产生与 arduino IDE 串行监视器完全相同的输出,所以我想一切正常。

为了尝试修复地图的问题,我删除了地图代码并简单地将每一行 print() 编辑到 XCode IDE 中,因为它是通过串行端口输入的.令我惊讶的是,数据中出现了随机换行符,我不明白为什么。我觉得这可能会导致我遇到的问题(在每个逗号处拆分字符串以便我可以提取各个值)所以想知道为什么它在 arduino IDE 中作为单行出现并且文本字段,但不在 XCode IDE 中,大概在我使用字符串的其他任何时候。

编辑:我将打印前缀为 XCode IDE 并将输出添加到带有五个加号的文本字段并添加五个破折号作为后缀,然后将串行端口设置为在发送单个后关闭报告(应该是单行数据)。我对这两件事的输出最终变成了三行,每行的前缀和后缀都是加号和破折号。请参见下面的照片,其中显示了应该是单行的内容:

为什么我的单行数据来自多行并且表现得像单个变量(如获取行的最后一个字符 returns 三行中第一行的最后一个字符,而不是分号)?

问题不太可能是插入了额外的换行符。相反,ORSSerialPort(就像它使用的底层 POSIX API 一样)只是在数据进入时向其委托报告数据。它无法知道对于您的特定用例,您只需要完整的行。

您需要缓冲传入的数据,并且仅在收到完整的 "line"/数据包后才对其进行处理。 ORSSerialPort 包含一个 API、ORSSerialPacketDescriptor 使这更容易。 API 这里有进一步的文档:https://github.com/armadsen/ORSSerialPort/wiki/Packet-Parsing-API

请注意,API(目前)还不支持仅使用结束分隔符。您需要从头到尾验证整个数据包,因为解析例程是 "lazy"。也就是说,它试图从数据包的末尾开始寻找可能的最小匹配。