6

我正在开发一个应用程序,在该应用程序中,我需要使用 OBD 连接器一次更新多个值,例如引擎 RPM、速度等参数。我需要实现异步命令/响应。为此,我使用[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数据和标签不匹配。

4

1 回答 1

0

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

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

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

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

于 2013-12-31T10:26:50.200 回答