У меня проблемы с использованием событий 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]
Когда в последовательный порт отправляется больше символов, блок кода не вызывается.Я все еще могу отправлять символы из последовательного порта, и я могу подтвердить, что символы отправляются, но блок не запускается второй раз.
Из документации и примеров в Интернете я ожидаю блокавызываться повторно, если в последовательном буфере есть символы.