Можем ли мы отправить файл через полудуплексное соединение?

Я работаю над дизайном загрузчика для контроллера Kinetis. Я использую это приложение терминала ( https://sites.google.com/site/terminalbpp/ ). Я могу отправлять такие тексты, как «Привет, мир» через свой последовательный порт, отлаживая код с помощью отладчика J link от Segger на моей плате.Отправка текстовых сообщений

Но когда я пытаюсь отправить файл приложения после программирования платы с помощью моего кода загрузчика, терминал не отвечает.

Это потому, что мое последовательное соединение является полудуплексным (RS 485) или это потому, что в моем коде есть какая-то ошибка?

Я не знаю, будет ли причиной полудуплексное соединение. Я хотел знать, будет ли это причиной. Если мой вопрос покажется вам глупым, объясните мне логику.

Спасибо за помощь

Обновлять:

Этот код успешно обеспечивает вывод, как показано на рисунке.

for(;;) { GPIO_PDD_TogglePortDataOutputMask(GPIOA_BASE_PTR, GPIO_PDD_PIN_21); CLS1_SendStr("Hello World!\r\n", CLS1_GetStdio()->stdOut); WAIT1_Waitms(1000); CLS1_SendStr("Welcome Ganesh!\r\n", CLS1_GetStdio()->stdOut); }Но этот код

` static void ReadText(void) { uint8_t buffer[32], ch, i;

      for(;;) {
        GPIO_PDD_TogglePortDataOutputMask(GPIOA_BASE_PTR, GPIO_PDD_PIN_21);
        CLS1_SendStr("Enter some text: ", CLS1_GetStdio()->stdOut);
        GPIO_PDD_TogglePortDataOutputMask(GPIOA_BASE_PTR, GPIO_PDD_PIN_21);
        buffer[0] = '\0';
        i = 0;
        do {
          if (CLS1_KeyPressed()) {
            CLS1_ReadChar(&ch); /* read the character */
            if (ch!='\0') { /* received a character */
              buffer[i++] = ch; /* store in buffer */
              if (i>=sizeof(buffer)) { /* reached end of buffer? */
                buffer[i] = '\0'; /* terminate string */
                break; /* leave loop */
              }
              if (ch=='\n') { /* line end? */
                buffer[i] = '\0'; /* terminate string */
                break; /* leave loop */
              }
            }
          }
        } while(1);
        GPIO_PDD_TogglePortDataOutputMask(GPIOA_BASE_PTR, GPIO_PDD_PIN_21);
        CLS1_SendStr("You entered: ", CLS1_GetStdio()->stdOut);
        CLS1_SendStr(buffer, CLS1_GetStdio()->stdOut);
        CLS1_SendStr("\r\n", CLS1_GetStdio()->stdOut);
      }
    }`

Он отлаживается на плате без каких-либо ошибок, но в терминальном приложении изменений нет. GPIO_PDD_TogglePortDataOutputMask(GPIOA_BASE_PTR, GPIO_PDD_PIN_21); Этот фрагмент кода включает и отключает передатчик при отправке и получении соответственно. Я делаю какую-либо ошибку в использовании этого фрагмента кода?

Ответы (2)

Для RS485 вы должны реализовать аппаратное квитирование с помощью RTS. Когда вы хотите отправить символы через UART, RTS включает передатчик, а прием RTS отключает передатчик и переключается в режим приема. RS485 обычно используется для связи ведущий/ведомый. где мастер посылает запрос: RTS ON->TX->RTS OFF->RX, а ведомый отвечает: RX->Мастер запрашивает меня?->RTS ON->TX (ответ)->RTS OFF->RX.

Спасибо за информацию. Теперь я ясно понимаю, что происходит.
Эй, вы можете перепроверить мой запрос и помочь мне? Я обновил его. Спасибо
Пытались ли вы сначала найти готовый код для своей платформы? Ошибка заключается в том, что вы отправляете текст в буфер UART, но не ждете, когда все символы будут выведены (символы все еще передаются из UART при выполнении следующих строк) - вам понадобится ISR для установки / сброса RTS. Или некоторые MCU уже имеют UART, способный к автоматическому рукопожатию, вам просто нужно правильно инициировать UART, сначала найти возможности, которые поддерживает ваш MCU. Тогда вам придется использовать вывод MCU, который предопределен как сигнал RTS.

Определенно возможно отправлять файлы по полудуплексным каналам, но вам нужно будет использовать полудуплексный протокол, в котором отправитель приостанавливает отправку каждый раз, когда ожидает ответа от получателя.

Спасибо за информацию. Да, я плохо изучил протокол.
Эй, вы можете перепроверить мой запрос и помочь мне? Я обновил его. Спасибо