2013-09-24 5 views
2

Я пытаюсь отправить данные printf на мое устройство uart. Я правильно написал write_r() funciton.newlib printf ошибка функции

Проблемы, которые я имею,

  • Когда я говорю printf(" My name is sam \n I am fine ");
  • и в следующий раз, когда я говорю printf(" I am back ");

первая проблема: Я могу видеть только " Меня зовут Сэм ", затем курсор переходит к следующей строке и останавливается там.

вторая проблема: «Я вернулся» не получает напечатанный на всех.

Я попытался удалить \n, но 2 printf не распечатывается. Нет ничего плохого в игре uart.

Похоже, что получено \ Указатель потерян.

Мой код

int write(int file, char *ptr, int len) { 

      #if !defined(OUT_8) 
     #define OUT_8(p,d)  (*(volatile char *)(p) = (char)(d)) 
     #endif 
     #if !defined(IN_8) 
      #define IN_8(p)   ((*(volatile char *)(p))) 
     #endif 

     OUT_8(DUART1_UMCR1, 0x02); //Informs external modem or peripheral that the UART is ready for sending data 
     OUT_8(DUART1_ULCR1, 0x03); 
     OUT_8(DUART1_UIER1, 0x0f); 
     OUT_8(DUART1_UFCR1, 0x8f); 

     OUT_8(DUART1_UTHR, '\n'); 
     OUT_8(DUART1_UTHR, '\r'); 
     while (ptr!=NULL) 
     { 
      if (*ptr=='\n') // JUST A TRY to avoid \n bug 
      { 
      OUT_8(DUART1_UTHR, '\n'); 
      wait(); 
      *ptr++; 
      *ptr++; 
      OUT_8(DUART1_UTHR, *ptr++); // \n & \r when given through printf isNot working 
      wait(); 
      } 


      OUT_8(DUART1_UTHR, *ptr++); // \n & \r when given through printf is not working 
      wait(); // TODO: 

      if(len==0) 
       break; 
      else 
       len--; 
     } 

      OUT_8(DUART1_UMCR1, 0x00); // say that modem is not not ready. Connection over 
      OUT_8(DUART1_UFCR1, 0x87); 
      OUT_8(DUART1_ULCR1, 0x00); // Clear all the interrupts ! virtually shut the UART port 
    errno = ENOSYS; 
    return -1; 
} 
+0

Я думаю, когда вы даете printf («некоторый текст \ n другой текст»), * ptr никогда не получает '\ n', он получает '\' и 'n' отдельно, так как ввод представляет собой строку. Вам нужно обработать это исключительно чем-то вроде: if (* ptr == '\' && * (ptr + 1) == 'n') – Dipto

+0

Весь 'if (* ptr == '\ n') {. ..}, конечно, не нужно. – chux

+0

@ Dipto Да, я пробовал, его не работало. – Sumanth

ответ

1

Уверенный, что OP I/O в буфер где.
Выход не отображается, пока не будет отправлено сообщение \r и/или \n.

#if !defined(OUT_8) 
    #define OUT_8(p,d)  (*(volatile char *)(p) = (char)(d)) 
#endif 

// make ptr a `const char *` 
int write(int file, const char *ptr, int len) { 
    OUT_8(DUART1_UMCR1, 0x02); //Informs UART is ready for sending data 
    OUT_8(DUART1_ULCR1, 0x03); 
    OUT_8(DUART1_UIER1, 0x0f); 
    OUT_8(DUART1_UFCR1, 0x8f); 

    while (len-- > 0) { 
    OUT_8(DUART1_UTHR, *ptr++); 
    wait(); 
    } 

    // Force an EOL at the _end_ of transmission. 
    OUT_8(DUART1_UTHR, '\n'); 
    OUT_8(DUART1_UTHR, '\r'); 
    wait(); 

    OUT_8(DUART1_UMCR1, 0x00); // say that modem is not not ready. Connection over 
    OUT_8(DUART1_UFCR1, 0x87); 
    OUT_8(DUART1_ULCR1, 0x00); // Clear all interrupts! virtually shut UART port 
    errno = ENOSYS; 
    return -1; 
} 

Я подозреваю, что буферизация происходит в приема сторону, либо УАПП или более вероятно, в терминалепросмотра данных. ОП сказал, что «курсор идет к следующей строке». В UART нет «курсора».

+0

Точно, он забуферирован в некотором коде 'vfprintf.c' newlib. Я просто не могу понять, где? Я уверен, что в UART нет ошибки. Boz UART - чистый голый металл, а его работа отлично проверена всеми видами персонажей и специальными символами, такими как \ n и т. Д. – Sumanth

+0

@Sumanth Попробуйте отправить различные сообщения, чередующиеся с физическими разъединениями/соединениями последовательного кабеля. Затем вы можете узнать, какая сторона выполняет буферизацию данных. – chux

+0

Ну, я думаю - я использую карту памяти heap1, где память не может быть освобождена - память может быть создана и не освобождена. Пожалуйста, дайте мне знать, если это причина, по которой printf работает только один раз, второй вызов печати не работает. Мой вопрос заключается в том, пытается ли printf освободить память после ее использования или когда используются некоторые специальные символы? @chux – Sumanth

0

Попробуйте позвонить fflush() для печати без \n.