c - 如何正确重置缓冲区以便下一次读取正确?

标签 c codewarrior

我的项目涉及通过 XBEE Wifi 从 PuTTY 向 Dragon12-Plus2 开发板(CodeWarrior 5.1)发送命令。我正在使用 4 个命令来控制来自 LBEbooks.com 的 LBE_DRAGON12_Plus 项目的 Dragon 板上的 LED {led_enable()、leds_on(此处为十六进制或十进制整数)、leds_off() 和 led_disable()}。这是我的代码:

// Final Project: Control leds via XBEE Wifi
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg256.h>     /* derivative information */
#include "queue.h"
#pragma LINK_INFO DERIVATIVE "mc9s12dg256b"

#include "main_asm.h" /* interface to the assembly module */

void main(void){
  int x,y,z,parser;
  int cmdLen = 0;                    
  char c,d,e;
  char cbuff[20];
  PLL_init();                             // set system clock frequency to 24 MHz 
  lcd_init();                             // enable lcd
  SCI1_init(9600);                        // initialize SCI1 at 9600 baud
  SCI0_init(9600);                        // initialize SCI0 at 9600 baud
  seg7_disable();                         // disable 7 segment display
  led_enable();                           // enable 8 leds
  while(1){
    if(SCI1SR1_RDRF == 1){
      c = inchar1();
      cbuff[cmdLen] = c;
      outchar0(cbuff[cmdLen]);
      if(c == ';'){
        if((cbuff[0] == 'l') && (cbuff[10] == ';')){
          leds_off();
          cmdLen = 0;
        } 
        else if((cbuff[0] == 'l') && (cbuff[12] == ';')){
          led_enable();
          cmdLen = 0;
        } 
        else if((cbuff[0] == 'l') && (cbuff[4] == 'd')){
          led_disable();
          cmdLen = 0;
        }
        else if((cbuff[0] == 'l') && (cbuff[13] == ';')){
          d = cbuff[10];
          e = cbuff[11];
          switch(d){                        // change first number to integer
            case('0'):
              x = 0x00;
              break;
            case('1'):
              x = 0x10;
              break;
            case('2'):
              x = 0x20;
              break;
            case('3'):
              x = 0x30;
              break;
            case('4'):
              x = 0x40;
              break;
            case('5'):
              x = 0x50;
              break;
            case('6'):
              x = 0x60;
              break;
            case('7'):
              x = 0x70;
              break;
            case('8'):
              x = 0x80;
              break;
            case('9'):
              x = 0x90;
              break;
            case('a'):
              x = 0xa0;
              break;
            case('b'):
              x = 0xb0;
              break;
            case('c'):
              x = 0xc0;
              break;
            case('d'):
              x = 0xd0;
              break;
            case('e'):
              x = 0xe0;
              break;
            case('f'):
              x = 0xf0;   
              break;
            default:
              break;
          }
          switch(e){                        // change second number to integer
            case('0'):
              y = 0x00;
              break;
            case('1'):
              y = 0x01;
              break;
            case('2'):
              y = 0x02;
              break;
            case('3'):
              y = 0x03;
              break;
            case('4'):
              y = 0x04;
              break;
            case('5'):
              y = 0x05;
              break;
            case('6'):
              y = 0x06;
              break;
            case('7'):
              y = 0x07;
              break;
            case('8'):
              y = 0x08;
              break;
            case('9'):
              y = 0x09;
              break;
            case('a'):
              y = 0x0a;
              break;
            case('b'):
              y = 0x0b;
              break;
            case('c'):
              y = 0x0c;
              break;
            case('d'):
              y = 0x0d;
              break;
            case('e'):
              y = 0x0e;
              break;
            case('f'):
              y = 0x0f;
              break;
            default:
              break;
          }
          z = (x + y);                      // add integers together
          leds_on(z);                       // display hex number on leds
          cmdLen = 0;                       // reset parser

        }
        for(parser = 0; parser < 20; parser++){
          cbuff[parser] = '\0';
        }
      }
      cmdLen++;
    }  
  }
}

我发送的第一个命令按预期工作(例如,如果我键入 leds_on(0xaa);在 PuTTY 中,4 个相应的 LED 灯亮起),但我之后发送的任何命令都没有执行任何操作。我不确定如何正确重置 cbuff,以便它每次都以相同的方式运行,而不仅仅是第一次。

编辑以显示建议的更改!

最佳答案

如果你想清除数组中的所有元素,那么memset 将是一个明智的选择:

memset(cbuff, 0, 20);

话虽如此,我强烈同意@John Bollinger 的观点,将输入和解释功能分开是明智的。

但是,根据应用程序的不同,memset 可能有点矫枉过正。简单清除数组也可以通过简单地将数组元素设置为空字符 ('\0') 来实现。只需为数组中的每个元素调用 cbuff[0] = '\0'

关于c - 如何正确重置缓冲区以便下一次读取正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27626755/

相关文章:

c - 在 C 中编写 malloc 模型

c - 为什么将 void 指针递增 1 会向前移动一个字节,但整数指针是 4 个字节, double 指针是 8 个字节?

c - 如何将进程移动到前台

c - 如何防止符号重新定义

c - 在结构定义内的函数指针内使用 void* 作为参数会导致语法错误

c - 我应该如何编写 C 代码以使生成的程序集使用额外的 dsll32 和 dsra32 指令?

c - 在数组中使用 int 还是 char?

c - 使用通用字段初始化结构的通用 API

c - _f_data_rom 链接描述文件符号

CodeWarrior 从 event.c 获取变量值