使用 ORSSerialPort / Xcode 进行串行读取
Posted
技术标签:
【中文标题】使用 ORSSerialPort / Xcode 进行串行读取【英文标题】:Serial Read with ORSSerialPort / Xcode 【发布时间】:2013-08-07 00:09:27 【问题描述】:我正在尝试使用 ORSSerialPort 库读取 XCode Cocoa 应用程序中的串行端口。我可以打开串行端口并开始读取数据的一切正常,但是读取数据时格式出现故障:
当我运行演示代码时,它工作得很好,读数看起来像这样(X,Y 值):
1,0 2,999 3,1999 4,3000 5,4000 6,5001
但是,当运行我的应用程序时,读数显示如下(使用 NSLog):
2013-08-06 19:53:59.649 TestApp[87361:303] 数据:1,0 2013-08-06 19:54:00.649 TestApp[87361:303] 数据:2,999 2013-08-06 19:54:00.653 TestApp[87361:303] 数据: 2013-08-06 19:54:01.652 TestApp[87361:303] 数据:3,1999 2013-08-06 19:54:02.651 TestApp[87361:303] 数据:4,3000 2013-08-06 19:54:03.651 TestApp[87361:303] 数据:5,400 2013-08-06 19:54:03.655 TestApp[87361:303] 数据:0 2013-08-06 19:54:04.654 TestApp[87361:303] 数据:6,5001
注意第3条日志是空白的,第6条日志不完整,第7条日志应该是第6条日志的结尾。似乎发送了随机返回字符,但我不知道是什么原因造成的。我还没有注意到格式如何/何时变坏的模式。
【问题讨论】:
你从什么设备读取数据? 嗨 Andrew,我正在使用 arduino 以 1 秒的间隔连续发送串行数据。 【参考方案1】:串行端口和相关的 API(包括 ORSSerialPort)对您的数据格式一无所知,因此无法保证它们会按照您的预期以相同的块传送数据。因此,您在单独的回调中获得“第 6 条日志”的最后一个字符这一事实并不异常。为了处理这个问题,你需要缓冲传入的数据,并以一种有意义的方式处理它。你不能假设你会在每次回调中得到一个完整的数据包。您现在使用的格式并不是特别适合这种情况,因为无法可靠地判断一个阅读从哪里开始,下一个从哪里开始。您可以通过多种方式解决此问题。最简单的方法是将它们设为固定长度(例如用零填充)。更好的办法是添加一些不会出现在数据包内容中的开始代码和/或结束代码。
至于第 3 行的空白日志语句,我不知道该怎么做。似乎您正在将数据转换回字符串并记录下来?大概那里有一个看不见的角色。如果将该日志语句更改为NSLog(@"Data: %@", receivedData);
,其中receivedData
是传递给-serialPort:didReceiveData:
调用的NSData 对象而不是字符串,您会得到什么输出?
【讨论】:
未转换为字符串的 NSData 对象的数据输出显示相同的行为。感谢您的格式建议,我会尝试一下。但它在您的演示代码中完美运行仍然很奇怪,这让我觉得我在代码中遗漏了一些东西。 我很想知道第三个日志行收到的数据的实际值。使用我的演示代码和您自己的代码得到不同的结果似乎很奇怪。如果没有看到更多您的项目,就不可能说出可能发生的事情。如果您想谈更多,请随时给我发电子邮件。以上是关于使用 ORSSerialPort / Xcode 进行串行读取的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 中的 ORSSerialPort.send 无法连接
为啥 ORSSerialPort serialPort:didReceiveData NSData 只有单字节?