Member 14499788 Ответов: 3

Как записать буфер в последовательный коммуникационный интерфейс


Привет всем, у меня есть функция считывания данных с uart, которая является :

void serial_read_appConfig(uint8_t *buffer, uint8_t noOfBytes)
{
   uint8_t i = 0;
   uint8_t temp = 0, rxDec;
   while (i != noOfBytes*2)
   {
      rxDec = asciiToDecConverter(sio2host_getchar());
      if (i%2 == 0) temp = rxDec << 4;
      else if (i%2 != 0) buffer[i/2] = temp + rxDec;
      if (rxDec != 255) i++; // increment count only when receiving a valid hex value from 0-F
   }
}

uint8_t asciiToDecConverter(uint8_t input)
{
   uint8_t decVal = -1;
   if (input >= 48 && input <= 57)  decVal = input - 48; // decimal values between 1 and 9
   else if (input >= 65 && input <= 70) decVal = input - 55; // hex values between A and F
   else if (input >= 97 && input <= 102) decVal = input - 87;  // hex values between a and f
   return decVal;
}


Что я уже пробовал:

Как я могу аналогично написать функцию для записи буфера в uart

Я не в состоянии понять возврат цикла while в программе,

Также функция getchar возвращает значение.
Но функция для чтения putchar не имеет возвращаемого значения.

void sio2host_putchar(uint8_t ch)
{
   sio2host_tx(&ch, 1);
}

uint8_t sio2host_getchar(void)
{
   uint8_t c;
   while (0 == sio2host_rx(&c, 1)) {
   }
   return c;
}
У меня есть функция для преобразования значения из Dectoasciiconverter(char ch);
Но я не могу понять , как использовать такую функцию, как serial_write_app_config().

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

Ваше здоровье!

3 Ответов

Рейтинг:
12

Member 14499788

наконец-то получил ответ .
Я публикую ответ здесь:

Спасибо всем за ваши предложения

void serial_write_appConfig(uint8_t*buffer, uint8_t noOfBytes)
{
	uint8_t i = 0;
	uint8_t temp = 0, txDec, chara;
	while (i < noOfBytes)
	
	{
		temp = buffer[i] >> 4;
		sio2host_putchar(Dectoasciiconverter(temp));
		temp = buffer[i] & 0x0F;
		sio2host_putchar(Dectoasciiconverter(temp));
		i++;
	}
	
	
}

unsigned char Dectoasciiconverter(unsigned char ch) {
    unsigned char value;
	ch &= 0x0F;
	
	if (ch >= 0 && ch <= 9)
		value = ch + '0';
	else //if (ch >= 10 && ch <= 15)
		value = ch + 'A' - 10;// || ch + 'a';
		
    return value;
}


0x01AA

Я не думаю, что это хорошая идея, чтобы иметь return 0; в методе с сигнатурой void serial_write_appConfig ;)

Рейтинг:
1

Richard MacCutchan

if (input >= 48 && input <= 57)  decVal = input - 48; // decimal values between 1 and 9

Зачем здесь использовать десятичные значения, которые на самом деле ничего не значат? Используйте правильные значения символов, чтобы люди могли понять, что делает код:
if (input >= '0' && input <= '9')  decVal = input - '0'; // decimal values between 0 and 9


Рейтинг:
0

OriginalGriff

getchar имеет возвращаемое значение, поскольку возвращает следующий полученный символ - он использует while цикл для ожидания, пока UART полностью не получит символ, затем извлекает его из аппаратного обеспечения и возвращает значение вызывающему объекту. Если такой символ никогда не будет получен, он никогда не выйдет.

putchar ничего не возвращает, потому что ему нечего возвращать - он делает прямо противоположное getchar и загружает символ в UART для передачи через последовательный порт*- там нечего возвращать!

* На самом деле он делает это плохо, и упрощенный код, подобный этому способу, хорошо вызывает проблемы, потому что последовательные данные медленны - например, 9600 бод приравнивается примерно к 1000 символам в секунду, а UART будет иметь очень маленький внутренний буфер - обычно около 8 символов или меньше. Поскольку код не проверяет, есть ли в буфере передатчика место, существует очень большая вероятность того, что вы перезапишете существующие данные и потеряете символы при попытке передать что-либо больше нескольких байт.


Member 14499788

у меня есть только 8 байт для передачи

Member 14499788

Спасибо за предложение, но как я могу построить подобную функцию для записи данных

OriginalGriff

Я не могу вам сказать - вам придется прочитать свое руководство по оборудованию / спецификацию / принципиальные схемы и разобраться в этом. Нет никакого "одного способа" сделать это, или даже "одного UART", чтобы сделать это!