我正在开发一个应用程序,其中需要使用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部分能对此有所启发。也许会更多地检查这个问题进行一些讨论。