2

我正在尝试使用 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条日志的结尾。似乎发送了随机返回字符,但我不知道是什么原因造成的。我还没有注意到格式如何/何时变坏的模式。

4

1 回答 1

0

串行端口和相关的 API(包括 ORSSerialPort)对您的数据格式一无所知,因此无法保证它们会按照您的预期以相同的块交付数据。因此,您在单独的回调中获得“第 6 条日志”的最后一个字符这一事实并不异常。为了处理这个问题,你需要缓冲传入的数据,并以一种有意义的方式处理它。你不能假设你会在每次回调中得到一个完整的数据包。您现在使用的格式并不是特别适合这种情况,因为无法可靠地判断一个读数从哪里开始,下一个读数从哪里开始。您可以通过多种方式解决此问题。最简单的方法是使它们成为固定长度(例如用零填充)。更好的是添加某种开始代码和/或结束代码

至于第 3 行的空白日志语句,我不知道该怎么做。似乎您正在将数据转换回字符串并记录下来?大概那里有一个看不见的角色。如果您将该日志语句更改为传递给调用的 NSData 对象NSLog(@"Data: %@", receivedData);而不是字符串,您会得到什么输出?receivedData-serialPort:didReceiveData:

于 2013-08-07T15:49:43.453 回答