1

我的源代码中发生了一些非常奇怪的事情。以下函数运行良好,当密码正确时打印“y”,当密码不正确时打印“n”。但是,如果我在 else 语句中添加一些 UART1_Write 和 Delay 函数,错误就会出现,即使密码是“zxc”(正确),它总是会进入 else 语句。我正在使用 MikroC PRO for 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(input, password) == 0 部分的 ELSE 语句中:

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 进入命令模式并在密码错误时断开用户连接是很重要的。请帮我解决问题。任何想法表示赞赏!

4

1 回答 1

3

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

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

可以在此处找到该库函数的描述。此外,根据库描述,它看起来 UART1_Read_Text()已经向 UART 数据添加了空终止。UARTx_Write_Text我根据他们在其网站上提供的描述和示例来做出这个假设。但是,我建议您确认确实如此。

此外,您的初始化password是多余的,char *password = "zxc\0"应更改为char *password = "zxc". 当您使用双引号声明字符串文字时,它会自动以空值结尾。这段摘录来自“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;
            }
        }
    }
}
于 2014-06-17T00:04:09.397 回答