1

我正在编写一个 iPhone 应用程序来与串行设备通信(通过 RN-XV 串行到 wifi 板)。目前的通信协议是非常基本的:iPhone 发送字符“D”,而串行设备以“;”分隔的字符串作为应答。并由 LF (\n) 终止。

目前我正在用 Arduino 模拟串行设备,代码如下:

if(Serial.available()){
    char ch = Serial.read();
    if(ch == 'D') Serial.println("04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;--- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;--- ;--- ;--- ;--- ;");
}

我发送的字符串只是串行设备发送的一个示例。

在 iPhone 端,我使用 GCDAsyncSocket 和以下代码:

在 ViewController.m 中:

- (void)viewDidLoad {
    [super viewDidLoad];
    mySocketConnection = [SocketConnection getInstance];
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(askForData) userInfo:nil repeats:YES];
}


- (void) askForData {
    NSData *requestData = [@"D" dataUsingEncoding:NSUTF8StringEncoding];
    [mySocketConnection.myGCDAsocket writeData:requestData withTimeout:-1.0 tag:0];
    [mySocketConnection.myGCDAsocket readDataWithTimeout:-1.0 tag:0];               
}

在 SocketConnection.m 中:

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {

    NSString *myString = [NSString stringWithUTF8String:[data bytes]];
    NSLog(@"Stringa: %@", myString);

    NSArray *myArray = [myString componentsSeparatedByString:@";"];
    NSLog(@"count = %d", [myArray count]);
}

问题是它的工作效率为 70%:

  • 大多数时候我收到的数据是正确的(数组中有 28 个对象)

  • 有时我没有收到任何东西(空)

  • 有时连同正确的字符串,我会收到更多我不知道它们来自哪里的数据

这是 XCode 控制台窗口中的输出示例:

2013-06-06 00:05:41.767 wakman[2714:907] 连接到主机:192.168.1.12 端口:2000

2013-06-06 00:05:43.868 wakman[2714:907] Stringa: (null)

2013-06-06 00:05:43.870 wakman[2714:907] 计数 = 0

2013-06-06 00:05:45.886 wakman[2714:907] Stringa: (null)

2013-06-06 00:05:45.888 wakman[2714:907] 计数 = 0

2013-06-06 00:05:47.868 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

2013-06-06 00:05:47.870 wakman[2714:907] 计数 = 28

2013-06-06 00:05:49.893 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

;--- ; => 这些数据来自哪里?

2013-06-06 00:05:49.895 wakman[2714:907] 计数 = 30

2013-06-06 00:05:51.892 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

--- ;--- ;--- ;--- ;--- ;--- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;第1467章 => 这些数据来自哪里?

2013-06-06 00:05:51.894 wakman[2714:907] 计数 = 44

2013-06-06 00:05:53.890 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

2013-06-06 00:05:53.892 wakman[2714:907] 计数 = 28

2013-06-06 00:05:55.886 wakman[2714:907] Stringa: (null)

2013-06-06 00:05:55.888 wakman[2714:907] 计数 = 0 => 没有数据?

我的代码有什么问题吗?

谢谢, 科拉多

4

0 回答 0