RedPark 无法从串口读取数据:UIViewController 与 UINavigationController

Posted

技术标签:

【中文标题】RedPark 无法从串口读取数据:UIViewController 与 UINavigationController【英文标题】:RedPark unable to read Data from Serial port: UIViewController vs. UINavigationController 【发布时间】:2013-02-09 00:08:18 【问题描述】:

我正在使用 Redpark Serial SDK 1.4 r270 来帮助 iphone 的 i/o 功能。我目前遇到的问题之一是读取使用

给出的数据
- (void) readBytesAvailable:(UInt32)numBytes 

这是我的错误。

Feb  8 15:27:50  iapd[897] <Warning>: ERROR - /SourceCache/iapd/iapd-1065.23/iapd/IAPSession.mm:-[IAPSessionBasic _sessionBufferToAppHasSpaceAvailable] - 823 session=0x1 for connectionID=0x1e12ea00 failed to write bytes, errno = 32
Feb  8 15:27:50  ios[7428] <Warning>: ERROR - /SourceCache/ExternalAccessory/ExternalAccessory-213/EASession.m:-[EASession dealloc] - 137 unable to close session for _accessory=0x20047eb0 and sessionID=65536
Feb  8 15:27:50  iOS[7428] <Warning>: ERROR - /SourceCache/ExternalAccessory/ExternalAccessory-213/EAOutputStream.m:-[EAOutputStream write:maxLength:] - 212 failed to write 229 bytes (wrote -1) with error 9
Feb  8 15:27:50  iOS[7428] <Warning>: ERROR - /SourceCache/ExternalAccessory/ExternalAccessory-213/EAInputStream.m:-[EAInputStream _readInputFromAccThread] - 357 error waiting for read data, errno = 9

这完全适用于单视图应用程序。

假设有一个 UINavigationController 具有视图 A 和视图 B,其中 A => B 当单击按钮时。视图 B 正在使用 RscMgr 线程,其中所有的魔法都恰好从串行端口读取。 在视图 B 的 UINavigationController 的第一个实例中,如果我们停留在此视图上,它可以正常工作。我们可以断开连接,连接端口,然后继续传输数据。

但是,如果我返回查看 A,然后返回查看 B。一切都将陷入困境。我无法再从此函数中读取数据,并且在控制台中发现 (MULTIPLE) 错误。有没有人有充分的理由说明为什么会发生这种情况以及我们如何解决它?我知道我们已经将 UIViewController 从堆栈中弹出,一切都重置了,并且再次创建了 RscMgr 线程,但没有查看任何内容。我不确定如何使用 SDK 清除缓冲区,因为它没有提供。

【问题讨论】:

【参考方案1】:

这比上面的解决方案简单。在不同的 .m 文件中定义您的函数,并从 AppDelegate 而非 ViewController 启动。

我以前编写的应用程序有这个问题。另一种选择是在 App Delegate 中声明 RscMgr,然后在给定的 ViewController 中对其进行初始化。

【讨论】:

【参考方案2】:

你声明的范围

- (void) readBytesAvailable:(UInt32)numBytes 

可能是问题所在。我会在您打开和关闭 B 时不会消失的地方声明它。例如在 UINavigationController 或 AppDelegate 上。

更好的是,创建一个新的单例类来管理 RedPark 的接口,并根据需要从应用程序的其余部分查询它。

【讨论】:

虽然这个函数在B中,所以如果我们回到B,我认为它应该仍然可以访问这个函数。我不确定这是否是导致错误的原因。 我按照您的建议将其放入 UINavigationController 中,并且效果很好。谢谢。我知道线程将始终运行.. 我想这是它工作的唯一原因。

以上是关于RedPark 无法从串口读取数据:UIViewController 与 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

如果没有用minicom打开一次,则无法从串口读取

如何从 R 中的串口读取数据

从两个串口异步读取

Redpark 串行电缆 Modbus RTU iOS

c#从串口读取数据怎样读一个就清空缓存

问题:关闭端口后,python 仍然读取来自 arduino 的串行数据。串口无法关闭