我正在开发一个应用程序,其中需要使用OBD连接器一次更新多个值,例如Engine RPM,Speed等参数。我需要实现异步命令/响应。为此,我将使用[gcdAsyncSocket writeData:data withTimeout:-1 tag:uniqueTag];和唯一标签异步发送命令。

但是当调用gcdAsync的委托(delegate)方法“socketDidReadDatawithTag”时,它将返回数据,但不正确。如果我分别用标签263和264发送了一个命令“010C\r”(读取RPM)和“010D\r”(速度),并且如果我在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中,数据和标签不匹配。

最佳答案

据我所知,OBD-II连接器(我认为它是ELM-327)不能真正处理异步调用。

它不能一次处理多个请求。您发送1条命令,然后OBD-II设备将从OBD总线中收集该信息并返回答案。然后它将处理您的下一个命令。当然,您发送的命令最终位于缓冲区中,该缓冲区将被一个接一个地处理。
我认为这对您来说可能是个问题,但我不确定。

我对ios编程以及这些标签会发生什么完全不熟悉。您设置这些标签以标识数据的参数是什么?
在答复数据中,您还可以看到其含义是什么,因此在答复本身中,您可以看到数据代表RPM或Speed等。

我希望OBD-II部分能对此有所启发。也许会更多地检查这个问题进行一些讨论。

09-25 18:45