Вывод массива char через UART

Tima123
Offline
Зарегистрирован: 29.01.2020

Здравствуйте, уважаемые форумчане.
Не получается разобраться с выводом массива char через UART.

Задача:

1.Отправить строку данных "$GNRMC,153240.00,A,4314.26717,N,07649.87500,E,0.018,,271021,,,A*60" через программу Terminal v1.9b в микроконтроллер.

2.Записать эту строку в массив char buffer[120].

3.Затем вывод этого массива через UART микроконтроллера в программу Terminal v1.9b

 

вот код:

void USART_init(void);
char USART_get_byte(void);
void USART_send_byte(char c);
void USART_send_str(char *s);

char buffer[120];

int main(void)
{
	USART_init();

	while(1)

{

				int i = 0;
				if (USART_get_byte())
				{
					buffer[i] = USART_get_byte();
					USART_send_byte(buffer[i]);
					i++;
				}

  }


В результате получается вот что:

Почему то часть символов теряется.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А чего ж Вы хотите, если читаете по 2 байта (один в 17-й строке, а второй - в 19-й), а запоминаете и передаете только по одному?

Объедините строки 17 и 19 так, чтобы прочитанный байт сразу попадал в буфер.

Tima123
Offline
Зарегистрирован: 29.01.2020

Спасибо, частично помогло
написал такой код:
 

void USART_init(void);
char USART_get_byte(void);
void USART_send_byte(char c);
void USART_send_str(char *s);

char buffer[120];

int main(void)
{
	USART_init();

	while(1)

{

				    for (int i=0; i<120; i++)
					{
				    buffer[i] = USART_get_byte();
					USART_send_byte(buffer[i]);
					i++;
					}
  }

Результат:

Теперь почти вся строка целая, кроме начала.  Должно быть $GNRMC, а приходит <0>RMC

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А чего #1 не последовали то?

void USART_init(void);
char USART_get_byte(void);
void USART_send_byte(char c);
void USART_send_str(char *s);

char buffer[120];

int main(void) {
	USART_init();

	while(1) {

				int i = 0;
				if ( buffer[i] = USART_get_byte() ) {
					USART_send_byte(buffer[i]);
					i++;
				}
         }

  }

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ЗЫ: У вас, кстати, скобки ‘}’ в приведённом вами коде не хватает. Main () не закрывается.

rkit
Offline
Зарегистрирован: 23.11.2016

BOOM пишет:

				if ( buffer[i] = USART_get_byte() ) {

Не имеет смысла - по uart может и 0 прилететь.

Tima123
Offline
Зарегистрирован: 29.01.2020

Сделал, так компилятор выдает предупреждение "suggest parentheses around assignment used as truth value".

Но все равно заработало так же как и у меня. Код:
Код:
 

void USART_init(void);
char USART_get_byte(void);
void USART_send_byte(char c);
void USART_send_str(char *s);

char buffer[120];

int main(void)
{
	USART_init();

	while(1)

{

			int i = 0;
				if ( buffer[i] = USART_get_byte() ) {
					USART_send_byte(buffer[i]);
					i++;
				}

  }

 }

Результат:

Приходит RMC без <0>, а должно $GNRMC

Tima123
Offline
Зарегистрирован: 29.01.2020

Да, я пропустил их когда копировал).

sadman41
Offline
Зарегистрирован: 19.10.2016

В Terminal 1.9 $ предваряет число, записанное в шестнадцетеричной форме.

В NMEA максимальная длина строки - 72 символа, если помню правильно. + 1 символ под терминатор, если нужен.

Tima123
Offline
Зарегистрирован: 29.01.2020

Да, кстати убрал символ "$" и вот что получилось:
 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Tima123 пишет:

Да, кстати убрал символ "$" и вот что получилось:
 

Так и должно быть.

b707
Offline
Зарегистрирован: 26.05.2017

Tima123 - выведите в HEX то, что вы передаете, а не то что получаете

Tima123
Offline
Зарегистрирован: 29.01.2020

HEX-вариант строки "$GNRMC,153240.00,A,4314.26717,N,07649.87500,E,0.018,,271021,,,A*60$0D"

24 47 4e 52 4d 43 2c 31 35 33 32 34 30 2e 30 30 2c 41 2c 34 33 31 34 2e 32 36 37 31 37 2c 4e 2c 30 37 36 34 39 2e 38 37 35 30 30 2c 45 2c 30 2e 30 31 38 2c 2c 32 37 31 30 32 31 2c 2c 2c 41 2a 36 30 24 30 44

Я, кстати, понял, почему там ошибка выходила. Там нужно два "$$" отправлять. В пограмме, в help, так записано.