0

我正在使用 PICKit3、MikroC PRO for PIC v6.0.0、PIC18F45 @ 8MHz 和 RN-42 蓝牙模块。我正在从笔记本电脑和我的 Android 应用程序连接到 RN-42 模块,并且我正在发送密码。奇怪的是,PIC 有时会说密码是正确的,但有时却不是。我正在发送相同的字符串。在测试时,它碰巧只有第一次不接受通过,其他所有尝试都接受了。PIC 和 RN-42 上的 UART 波特率设置为 9600。RN-42 上的 RTS 和 CTS 未连接。

我也试过:

char password[] = "abc";
char password[4] = "abc";
char password[5] = "abc\0";
char *password = "abc\0";

strcmp(input, "\0"); after the UART1_Read_Text(input, "|", MAX_UART_RX_CHARACTERS);

但它是一样的......可能是什么问题,是在我的代码中还是在 MikroC 函数中可能存在和问题?

void authenticate() {
     char input[MAX_UART_RX_CHARACTERS + 1] = "";
     char password[] = "abc\0";
     unsigned char ready = 0;

     Delay_ms(500);
     UART1_Write_Text("TRobot\n");

     while (connected && !ready) {
           if (UART1_Data_Ready()) {
              TMR0ON_bit = 0;
              time_out = 0;
              UART1_Read_Text(input, "|", MAX_UART_RX_CHARACTERS);

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

              ready = 1;
           }

           if (time_out) {
              disconnect();
           }
     }
}

UARTx_Read_Text() 原型:

void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);

UARTx_Read_Text() 说明:

读取通过 UART 接收的字符,直到检测到分隔符序列。读取的序列存储在参数输出中;定界符序列存储在参数定界符中。

这是一个阻塞调用:需要定界符序列,否则程序退出(如果未找到定界符)。

参数 :

输出:接收到的文本分隔符:标识接收到的字符串结尾的字符序列尝试:定义接收到的字符数,其中预期分隔符序列。如果 Attempts 设置为 255,此例程将不断尝试检测 Delimiter 序列。

例子:

读取文本直到收到序列“OK”,然后发回收到的内容:

UART1_Init(4800);                         // initialize UART1 module
Delay_ms(100);

while (1) {
  if (UART1_Data_Ready() == 1) {          // if data is received 
    UART1_Read_Text(output, "OK", 10);    // reads text until 'OK' is found
    UART1_Write_Text(output);             // sends back text 
 }
}
4

5 回答 5

3

可能UART1_Read_Text()不会像预期的那样表现。我查找了该(非标准)功能的文档/源代码,但没有找到。

当用户按下回车键时,确保它input以一个字符正确终止。'\0'

于 2014-07-02T07:16:08.647 回答
1

您可以strlen(input)查看后面是否有不可见的符号,或者逐个比较数组值以查看差异在哪里。

strncmp(input, password, strlen(password));可能有所帮助。这将忽略其长度后面的所有符号password将成为abcd有效密码,所以要害怕这一点。

于 2014-07-02T07:42:24.103 回答
1

我解决了这个问题。我发现问题是在调用 disconnect() 后发生的

通常,当输入与密码不同时,将调用 disconnect()。我注意到,当建立新连接并发送正确的密码字符串时,每次都会在输入字符串的开头添加两个额外的字节。我使用 UART1_Write_Text(input) 做了一个简单的调试。

断开功能是将 RN-42 模块设置为命令模式,终止连接并退出命令模式。RN-42 红色 LED 开始快速闪烁,然后变慢,这意味着它不再处于 CMD 模式。我刚刚删除了断开连接功能,并在密码尝试之间设置了 5000 毫秒的超时。但我仍然不知道究竟是什么导致了这个问题。

void disconnect() {
     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');
     Delay_ms(100);
}
于 2014-07-05T07:51:33.860 回答
1

strcmp() 使用相同的输入返回不同的值

不,不是的。当呈现相同的输入时,strcmp()将返回相同的输出。显然,您没有将相同的输入传递给对strcmp(). 您需要进行一些调试来检查这些值,从而找出它们的不同之处。

于 2014-07-02T08:29:09.380 回答
0

看起来读取函数错误地获取了数据。似乎禁用了中断。建议启用 IRQ 并通过中断接收数据。否则您将丢失数据。

无论如何,比较 1. 设备在物理上得到什么和 2. 读取功能起作用后掉到内存中的内容是有帮助的。

  1. 用示波器观察——它是一个很短的字节序列,在那里很容易看到。

  2. 您可以通过不同的接口(如果有)进行输出,或者使用 JTAG 对其进行调试。

请包括任何结果和更新问题,以便任何人都能获得更多理解并给出更好的答案,

于 2014-07-02T09:55:57.880 回答