使用GCDAsyncSocket API进行异步值更新

6
我正在开发一个应用程序,需要使用OBD连接器同时更新多个参数值,例如引擎转速、速度等。我需要实现异步命令/响应。为此,我使用唯一标记异步地发送命令,例如[gcdAsyncSocket writeData:data withTimeout:-1 tag:uniqueTag];
但是当gcdAsync的委托方法“socketDidReadDatawithTag”被调用时,它返回的数据不正确。例如,如果我发送了一个名为“010C\r”的命令(读取RPM)和一个名为“010D\r”的命令(速度),分别带有标记263和264,如果我在socketDidReadDatawithTag中使用标记264解析响应,有时会返回RPM的数据。(我的响应混乱了或者OBD设备无法处理异步响应)
    NSLog(@"Command Sent for Async : %@",commandString);
    NSData *data = [commandString dataUsingEncoding:NSASCIIStringEncoding];

    long obdObjectTag = [obdObject getPIDTag];//Unique Tag
    [gcdAsyncSocket writeData:data withTimeout:-1 tag:obdObjectTag];

    NSData *readData = [@">" dataUsingEncoding:NSASCIIStringEncoding];
    [gcdAsyncSocket readDataToData:readData withTimeout:-1 tag:obdObjectTag];

socketdidReadDatawithTag中,数据和标记不匹配。

1个回答

0

据我所知,OBD-II连接器(我假设它是ELM-327)实际上无法处理异步调用。

它无法同时处理多个请求。您发送1个命令,OBD-II设备将从OBD总线收集该信息并返回答案。然后它将处理您的下一个命令。当然,您发送的命令最终会进入缓冲区,逐个进行处理。我认为这可能会成为您制作它的问题,但我不确定。

我对ios编程和这些标签发生的情况一点也不熟悉。您设置这些标签是为了识别哪些参数是数据吗?在回复数据中,您还可以看到它是针对哪个参数的,因此在答案本身中,您可以看到数据表示RPM或速度等。

希望OBD-II部分已经为您提供了一些启示。也许会更多地讨论这个问题。


是的,我了解到OBD设备无法处理异步请求。因此,我需要逐个发送命令并等待响应。所以我已经集成了这个功能。顺便说一句,谢谢你的回复。 - iCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接