Использование C в микросхемах разработки TI EZ430-RF2500

#c #embedded #msp430

#c #встроенный #msp430

Вопрос:

Итак, что я пытаюсь сделать, это получить пакет и распечатать полезную нагрузку на последовательный порт. Прослушивание в порту — это скрипт на Python, который повторно собирает полезную нагрузку и выполняет с ней некоторые действия.

Вот код:

 #include "mrfi.h"
int main(void)
{
  BSP_Init();
  MRFI_Init();
  //Initialize the serial port
  P3SEL    |= 0x30;
  UCA0CTL1  = UCSSEL_2;
  UCA0BR0   = 0x41;
  UCA0BR1   = 0x3;
  UCA0MCTL  = UCBRS_2;                     
  UCA0CTL1 amp;= ~UCSWRST;
  MRFI_WakeUp();
  MRFI_RxOn();
  __bis_SR_register(GIE LPM4_bits);
}
//This is run when a packet is received
void MRFI_RxCompleteISR()
{
  uint8_t i;
  P1OUT ^= 0x02;
  mrfiPacket_t packet;
  MRFI_Receive(amp;packet);
  char output[] = {"                   "};
  for (i=9;i<29;i  ) {
    output[i-9]='a';
    if (packet.frame[i]=='r') {
      output[i-9]='n';
      output[i-8]='r';
    }
  }
  TXString(output, (sizeof output));
}
  

Я отправляю пакет с тестовыми данными, но ничего. У кого-нибудь есть какие-либо идеи? Также, чтобы вы знали, я изучаю C, пока занимаюсь этим, поэтому любые указания по дизайну также были бы замечательными.

Спасибо.

Комментарии:

1. Как далеко проникают данные? Вы знаете, запущен ли ISR вообще? Вы проверяете все коды ошибок и регистры состояния и обновляете индикатор состояния?

2. Попробуйте задать на msp430@yahoogroups.com список рассылки, возможно, там есть люди, у которых есть опыт решения связанных с этим проблем.

3. Что произойдет, если добавить while (1) TXString("hellorn", 7); в конце main() ? Что-нибудь отображается на последовательном порту? (это подскажет вам, работают ли ваши последовательные процедуры в любом случае …)

4. @Potatoswatter: Как я уже упоминал, я очень новичок в этом, мне в основном дал это профессор и сказал заставить это работать, я не вижу кодов ошибок, а P1OUT ^ = 0x02 переключает индикатор.

5. @Lindydancer Я сделаю это, чего ты ОЧЕНЬ хочешь. @Michael Я добавил «while (1) TXString(‘a’, 1);» в конце, и это ничего не дало.

Ответ №1:

Я не знаю, почему ваш код не работает, но вот несколько советов по дизайну, как и было запрошено.

  • Поскольку это, по-видимому, система без хоста, main (), скорее всего, должна возвращать void. Я предполагаю, что вы опубликовали не весь свой код, так как в режиме без хостинга в main () также должен быть вечный цикл.

  • Удалите все «магические числа» из кода и замените их битовыми масками #defined или константами.

  • Сведите весь код внутри прерываний к минимуму. Оптимальное прерывание устанавливает только некоторые флаги.

  • Не используйте неопределенную ширину (output[]) для массивов / строк. Дизайн встроенной системы заключается в том, чтобы сделать вещи детерминированными и фиксированными.

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

 uint8_t output[OUTPUT_N];

memset(output, ' ', SPACES_N);
output[OUTPUT_N - 1] = '';

for(i=0; i < SOMETHING; i  )
{
  output[i   A_OFFSET] = 'a';

  if(packet.frame[i   FRAME_OFFSET] == 'r')
  {
    output[i   CR_OFFSET] = 'r';
    output[i   LF_OFFSET] = 'n';
  }
}