-1

我有一个发射器的代码,我有一个问题,当我从发射器获得输入时,我将它保存在一个字符数组“rec”中,在我完成接收后,我将它与我的其他数组进行比较,并基于该比较我点亮在portb 中安装一个灯泡。但是代码没有给我任何错误,也没有灯泡(我已经尝试过连接工作)它与比较数组部分有关。我这样做对吗?谢谢

char rec[3];
char cmp1[]= "1000";
char cmp2[]= "1010";
char cmp3[]="1111";
char cmp4[]="1001";
int i=0;
int beginrecord;
void main(void)
{
TRISB=0;
TRISD=0;
TRISC=255;
PORTC=0;
PORTB=0;

       while(1)
       {
             if(PORTC==1)
             {
             rec[i]=1;
             i++;
             beginrecord = 1;
              delay_ms(1);
             }

             if (PORTC==0 && beginrecord==1)
            {
                rec[i]=0;
                i++;
                delay_ms(1);

            }

            if(i==4) {
            beginrecord = 0;
            i = 0;
            if(rec == cmp1){
            portb = 0x01;}
            else if(rec == cmp2){
            portb = 0x02;}
            else if(rec == cmp3){
            portb = 0x04;}
            else if(rec == cmp4){
            portb = 0x08;}

            }
    }
}
4

3 回答 3

2

您必须使用strcmp(rec, cmp1) == 0 而不是rec == cmp1.

你现在这样做的方式,你只比较指针,它们永远不会相同。

你确定你的端口返回一个字符10不是值 0/1?

在那种情况下,您的比较也行不通。

您的代码的其他一些问题:

  1. 我假设端口的字符形式是二进制值而不是 ASCII 字符。
  2. 如果它确实是一个 ASCII 字符并且您使用 strcmp() 那么您必须在缓冲区的末尾添加一个零字节。
  3. 如果接收到多个字节而不是位,则必须使用 memcmp() 而不是 strcmp()。在这种情况下,您对 cmpX 的初始化也是错误的。如果它是您收到的位,您可能希望在比较之前将它们组合成字节(假设是串行端口)。
  4. PORTC 始终为 0,因此它不能在您的代码中变为 1。
  5. 您似乎混合了 PORTB 与 portb 的大小写。
  6. 你的变量没有类型。
于 2013-07-08T18:14:10.427 回答
0

在这里,您声明了三个cmp[]char 类型,它是一个字符串,所以它就像“1000”。它是 4 字节数据。而你rec[3]只有 3 个字节。我认为您尝试比较 int 类型。喜欢

1001 == 1001 in binary

将它们声明为unsigned int然后尝试比较。

并使您的所有值都充满 8 位,例如00001000bnot 1000。或者我可能弄错了。

于 2013-07-08T18:26:04.727 回答
0

有许多问题会混淆您的目标 - 请参阅上面的评论,但我已尝试在下面解决它们。

不是将 累积rec为一个数组,而是将这些位累积在一个int. 这简化了与原始样式的比较。

beginrecord需要初始化。变量被带入本地范围。

清理了凹痕。

const int cmp1 = 8;  // "1000";
const int cmp2 = 10; // "1010";
const int cmp3 = 15; // "1111";
const int cmp4 = 9;  // "1001";
void main(void) {
  TRISB = 0;
  TRISD = 0;
  TRISC = 255;
  PORTC = 0;
  PORTB = 0;

  int i = 0;
  int beginrecord = 0;
  int rec = 0;
  while (1) {
    if (PORTC == 1) {
      rec <<= 1; /* rec = rec * 2 */
      rec |= 1;
      beginrecord = 1;
      delay_ms(1);
      i++;
    }
    else if (PORTC == 0 && beginrecord == 1) {
      rec <<= 1;
      delay_ms(1);
      i++;
    }
    if (i == 4) {
      if (rec == cmp1) {
        PORTB = 0x01;
      } else if (rec == cmp2) {
        PORTB = 0x02;
      } else if (rec == cmp3) {
        PORTB = 0x04;
      } else if (rec == cmp4) {
        PORTB = 0x08;
      }
      beginrecord = 0;
      i = 0;
      rec = 0;
    }
  }
}
于 2013-07-08T18:49:55.110 回答