代码的执行总是进入else语句

时间:2014-06-16 19:07:58

标签: c microcontroller pic microchip mikroc

我的源代码中发生了一些非常奇怪的事情。 以下功能运行良好,打印出来的' y'如果密码正确并打印出来,那就是' n'当它不正确。但是如果我在else语句中添加了一些UART1_Write和Delay函数,那么即使密码是" zxc" (正确)它总是进入else语句。 我使用MikroC PRO作为PIC v6.0.0,机器人系统由PIC18F452和RN-42蓝牙模块连接而成。我正在测试带有蓝牙和TeraTerm的笔记本电脑。

了解更多信息:http://instagram.com/p/pLnU9eDL8z/#

这是一个很好的工作程序:

void authenticate() {
     char *input = "";
     char *password = "zxc\0";
     unsigned char ready = 0;

     while (connected && !ready) {
           if (UART1_Data_Ready()) {
              UART1_Read_Text(input, "|", 17);
              strcat(input, "\0");

              if (strcmp(input, password) == 0) {
                 UART1_Write('y');
                 ready = 1;
              } else {
                 UART1_Write('n');
                 ready = 1;
              }
           }
     }
}

此例程的例程总是在strcmp的ELSE语句中输入(输入,密码)== 0部分:

void authenticate() {
     char *input = "";
     char *password = "zxc\0";
     unsigned char ready = 0;

     while (connected && !ready) {
           if (UART1_Data_Ready()) {
              UART1_Read_Text(input, "|", 17);
              strcat(input, "\0");

              if (strcmp(input, password) == 0) {
                 UART1_Write('y');
                 ready = 1;
              } else {
                 UART1_Write('n');
                 Delay_ms(100);
                 UART1_Write('$');
                 Delay_ms(100);
                 UART1_Write('$');
                 Delay_ms(100);
                 UART1_Write('$');
                 Delay_ms(100);
                 UART1_Write('K');
                 Delay_ms(100);
                 UART1_Write(',');
                 Delay_ms(100);
                 UART1_Write('-');
                 Delay_ms(100);
                 UART1_Write('-');
                 Delay_ms(100);
                 UART1_Write('-');
                 Delay_ms(100);
                 UART1_Write('\n');
                 ready = 1;
              }
           }
     }
}

发送所有这些附加符号以使RN-42进入命令模式并在密码错误时断开用户连接非常重要。 请帮我解决问题。任何想法都赞赏!

1 个答案:

答案 0 :(得分:3)

正如其他人在评论部分指出的那样,您的代码的一个主要问题是您试图将UART数据存储到不属于您的内存中。

当您声明char *input = "";时,除了存储“\0”的单个字节外,您实际上没有分配任何空间。然后,当您使用UART1_Read_Text()时,您可以告诉该函数在找到分隔符之前最多可以读取17个字符 - 所有这些字符都应存储在input指向的位置。

可以找到该库函数的描述here。此外,根据库描述,看起来像 UART1_Read_Text()已经将空终止添加到UART数据。我的假设基于UARTx_Write_Text的描述以及他们在网站上提供的示例。但是,我建议您确认确实如此。

此外,password的初始化是多余的,char *password = "zxc\0"应更改为char *password = "zxc"。使用双引号声明字符串文字时,它会自动以null结尾。摘录摘自“C in a Nutshell”:

  
    

字符串文字由用双引号括起来的一系列字符(和/或转义序列)组成...字符串文字是一个char的静态数组,其中包含字符代码,后跟一个字符字符串终结符,空字符\ 0 ...空字符串“”在内存中占用正好一个字节,它保存终止空字符。

  

基于以上所述,我会更喜欢这样:

#define MAX_NUM_UART_RX_CHARACTERS    17
void authenticate() 
{
    char input[MAX_NUM_UART_RX_CHARACTERS + 1];
    char *password = "zxc";
    unsigned char ready = 0;

    while (connected && !ready) 
    {
        if (UART1_Data_Ready()) 
        {
            UART1_Read_Text(input, "|", MAX_NUM_UART_RX_CHARACTERS);

            if (strcmp(input, password) == 0) 
            {
                UART1_Write('y');
                ready = 1;
            } 
            else 
            {
                UART1_Write('n');
                ready = 1;
            }
        }
    }
}