2012-06-23 6 views
0

Я открыл следующие входные и выходные потоки через рамку внешних устройств:чтение и запись данных в потоки как исходные данные?

session = [[EASession alloc] initWithAccessory:acc forProtocol:protocol]; 

     if (session){ 
      [[session inputStream] setDelegate:self]; 
      [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
      [[session inputStream] open]; 

      [[session outputStream] setDelegate:self]; 
      [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
      [[session outputStream] open]; 
     } 

Теперь у меня есть очень тупой вопрос, так как большинство из моих новичков вопросов. Как я могу отправить сырые 1 байт данных в поток? Скажем, я хочу отправить 0x06. Как мне это сделать?

А потом ... как читать данные из потока? Я буду отправлять данные для обработки байта байтом ... байты будут числами в байтовом диапазоне (0x00 - 0xFF).

Благодарим за терпение и помощь!

ответ

1

Запись данных байт в байт не самый эффективный способ, но если вы настаиваете:

uint8_t aByte = 0x06; 
if ([[session outputStream] write:&aByte maxLength:1] < 0) 
    /* handle error */; 

Аналогично, чтобы прочитать байт за байтом:

uint8_t aByte; 
NSInteger result = [[session inputStream] read:&aByte maxLength:1]; 
if (result > 0) 
    /* handle received byte */; 
else if (result == 0) 
    /* handle end-of-stream */; 
else 
    /* handle error */; 

Если вы хотите для чтения или записи больших фрагментов данных, передайте указатель на буфер более одного байта и укажите длину. Обязательно обрабатывайте короткие чтения и записи, где код возврата положителен, но меньше указанного вами. Вам нужно дождаться, когда поток будет готов к большему и продолжит работу, где он остановился. Для чтения вы также можете использовать -getBuffer:length:, где структура выделяет буфер длиной по своему выбору.

+0

Другой немой вопрос: как я могу напечатать aByte в NSLog? Когда я делаю NSLog (@ "% @", aByte) или NSLog (@ "% s", aByte) ... программа вылетает. –

+1

Спецификатор формата «% @» рассматривает соответствующий аргумент как указатель объекта. «% s» рассматривает его как указатель строки C для непредсказуемой кодировки. Сбой происходит из-за того, что 'aByte' не является допустимым указателем любого типа, поэтому разыменовывает его, обращается к недопустимому адресу. Для 'aByte' вы можете использовать либо«% hhu »(для десятичного), либо«% hhx »(для шестнадцатеричных). «u» и «x» означают целочисленный тип без знака. Один «h» означает «короткий int», а «hh» означает «char» (что и лежит в основе типа 'uint8_t'). –

 Смежные вопросы

  • Нет связанных вопросов^_^