從串行端口讀取時,使用Grand Central調度源事件時遇到問題。無法使用GCD調度源讀取串行端口文件描述符
我使用dispatch_source_create和DISPATCH_SOURCE_TYPE_READ,這樣當從與串口相關聯的fileDescriptor中讀取數據時,OS將運行我的代碼塊。這裏是我的代碼
- (void) receiveThread
{
globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
readSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ,
[self fileDescriptor],
0,
globalQueue);
dispatch_source_set_event_handler(readSource, ^{
char buffer[512];
NSString *bar;
ssize_t numBytes;
int expected;
expected = dispatch_source_get_data(readSource);
printf("expected:%d\n",expected);
do {
numBytes = read([self fileDescriptor], buffer, 512);
buffer[numBytes] = '\x000'; //make sure that the string is terminated.
printf("bytes:%ld\n",numBytes);
if (numBytes != -1)
{
bar = [NSString stringWithCString:&buffer];
//printf("bytes:%ld\n",numBytes);
NSLog(@"String:%@\n",bar);
[[NSNotificationCenter defaultCenter] postNotificationName:EISerialTextDidArrive object:bar];
}
} while (numBytes > 0);
});
dispatch_resume(readSource);
}
當程序運行時該塊被稱爲第一次發送串行數據到端口。然後,我在控制檯中收到消息
[Switching to process 11969 thread 0x6603]
當更多字符發送到串行端口時,不會調用該代碼塊。我仍然可以從串口發送字符,並且我可以確認字符正在發送,但塊不會再次運行。
從Web上的文檔和示例中,我期望只要串行緩衝區中有字符就可以重複調用該塊。
看起來好像串行端口不能用這種方式與GCD一起工作。我曾嘗試使用MAAsyncIO庫,其結果與上面的嘗試類似。我可以確認串口使用select()函數調用。我一直無法讓他們使用kqueue(),儘管我懷疑這是由我的代碼中的問題引起的。 – 2011-03-23 23:21:44