我正在开发一个应用程序,我需要使用OBD连接器一次更新多个值,如Engine RPM,Speed等参数。我需要实现异步命令/响应。为此,我使用[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
数据和标记不匹配。
答案 0 :(得分:0)
据我所知,OBD-II连接器(我假设它是一个ELM-327)无法真正处理异步调用。
一次无法处理多个请求。您发送1个命令,OBD-II设备将从OBD总线收集该信息并返回答案。然后它将处理你的下一个命令。当然,您发送的命令最终会在缓冲区中逐个处理。 我认为这对你来说可能是一个问题,但我不确定。
我对ios编程以及这些标签会发生什么并不熟悉。您设置这些标签以确定哪些参数是数据? 在回复数据中,您还可以查看它的含义,因此在答案本身中您可以看到数据代表RPM或速度等。
我希望OBD-II部分对此有所了解。对于某些讨论,可能会更多地检查这个问题。