GCDAsyncSocket数据接收异常

时间:2013-06-05 22:55:30

标签: ios serial-communication gcdasyncsocket

我正在编写iPhone应用程序以与串行设备通信(通过RN-XV串口到wifi板)。 目前,通信协议非常基础:iPhone发送字符“D' 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个对象)

  • 有时我没有收到任何内容(null)

  • 有时与正确的字符串一起,我收到了一些我不知道它们来自哪里的数据

这是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] count = 0

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

2013-06-06 00:05:45.888 wakman [2714:907] count = 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] count = 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] count = 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] count = 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] count = 28

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

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

我的代码有什么问题吗?

谢谢, 的Corrado

0 个答案:

没有答案