Как мы лишний байт в USART-е искали

Обнаружилась в АЦП нашем магия такая чуднАя — время от времени приходит от него на один байт больше, чем надо. Всегда в одном и том же месте, да один и тот же байт — r. Вот оно как.
Колдунство это гадкое данные зело портило, и сумма контрольная сходилась плохо. Никак даже не сходилась, эх…

Грешили сначала на плату фаствеловскую cpc108. Потом на рс, как это повелось у нас. Но нет, вроде все в порядке полном оказалось.

Почесали коллеги лики бородатые и взяли прибор от сглаза всякого помогающий — сцылограф…

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

Такой вот код был, массив цифирями по порядку от 0 до 39 забивающий, упорядоченную пачку байтов в рс с паузами равными отправляющий:

int ain16_send_command(unsigned char * string, unsigned short nbytes)
{
	int i=0, t=0;
	int c=0;

	while(i

И показал прибор чудодейственный чуду чудесную. Шли байты равными размерами с равными промежутками, да только один байт уродец какой-то вышел - двойной толщины ажно. И другой раз, и третий... И был это тот самый байт, который лишним приходил.

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

int usart_putchar(volatile avr32_usart_t *usart, int c)
{
  int timeout = USART_DEFAULT_TIMEOUT;

  if (c == 'n')
  {
    do
    {
      if (!timeout--) return USART_FAILURE;
    } while (usart_write_char(usart, 'r') != USART_SUCCESS);

    timeout = USART_DEFAULT_TIMEOUT;
  }

  do
  {
    if (!timeout--) return USART_FAILURE;
  } while (usart_write_char(usart, c) != USART_SUCCESS);

  return USART_SUCCESS;
}

Натыкаясь на байт с кодом 0x10 ("n"), ажно два байта сразу отправлял он без спросу и удержу - 0x13 (r) и 0x10 (n).

Закаментили мы драйверу гадости лишние, не долго думая, и с тех пор стали жить поживать, да добра наживать с работающим ацп.

Похожий бред:

Как мы лишний байт в USART-е искали: 2 комментария

  1. Спасибо Огромное за Ваше реалити-шоу, очень полезно для начинающих знакомство с AVR32! Ждем продолжения, если веременем располагаете.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Protected by WP Anti Spam