从串行端口读取时,我在使用 Grand Central Dispatch Source 事件时遇到问题。
我将 dispatch_source_create 与 DISPATCH_SOURCE_TYPE_READ 一起使用,这样当从与串行端口关联的 fileDescriptor 中读取数据时,操作系统将运行我的代码块。这是我的代码
- (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]
当更多字符被发送到串行端口时,不会调用代码块。我仍然可以从串行端口发送字符,并且可以确认正在发送字符,但该块不会再次运行。
从网络上的文档和示例中,我希望只要串行缓冲区中有字符,就会重复调用该块。