Я работаю над дизайном загрузчика для контроллера 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);
Этот фрагмент кода включает и отключает передатчик при отправке и получении соответственно. Я делаю какую-либо ошибку в использовании этого фрагмента кода?
Для RS485 вы должны реализовать аппаратное квитирование с помощью RTS. Когда вы хотите отправить символы через UART, RTS включает передатчик, а прием RTS отключает передатчик и переключается в режим приема. RS485 обычно используется для связи ведущий/ведомый. где мастер посылает запрос: RTS ON->TX->RTS OFF->RX, а ведомый отвечает: RX->Мастер запрашивает меня?->RTS ON->TX (ответ)->RTS OFF->RX.
Определенно возможно отправлять файлы по полудуплексным каналам, но вам нужно будет использовать полудуплексный протокол, в котором отправитель приостанавливает отправку каждый раз, когда ожидает ответа от получателя.
Ганеш Рамачандран
Ганеш Рамачандран
Марко Буршич