使用GCDAsynSocket api更新异步值

时间:2013-12-30 10:49:49

标签: ios asynchronous gcdasyncsocket obd-ii

我正在开发一个应用程序,我需要使用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数据和标记不匹配。

1 个答案:

答案 0 :(得分:0)

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

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

我对ios编程以及这些标签会发生什么并不熟悉。您设置这些标签以确定哪些参数是数据? 在回复数据中,您还可以查看它的含义,因此在答案本身中您可以看到数据代表RPM或速度等。

我希望OBD-II部分对此有所了解。对于某些讨论,可能会更多地检查这个问题。