#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';
}
}