UART1_Read_Text()问题

时间:2014-07-02 07:10:04

标签: c embedded pic microchip mikroc

我正在使用PICKit3,MikroC PRO用于PIC v6.0.0,PIC18F45 @ 8MHz和RN-42蓝牙模块。我从笔记本电脑和Android应用程序连接到RN-42模块,我正在发送密码。奇怪的是,PIC有时会说密码是正确的,但有时却没有。我发送相同的字符串。在测试时,它恰好第一次不接受通过,所有其他尝试都被接受。 PIC和RN-42上的UART波特率均为9600。 RTS& RN-42上的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 
 }
}

5 个答案:

答案 0 :(得分:3)

可能UART1_Read_Text()的行为不符合预期。我查找了该(非标准)函数的文档/源代码,但未能找到任何函数。

当用户按下返回时,请确保使用input字符正确终止'\0'

答案 1 :(得分:1)

您可以执行strlen(input)查看后面是否有隐藏符号,或者按值比较数组值,以查看差异所在。

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

答案 2 :(得分:1)

  

strcmp()返回具有相同输入的不同值

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

答案 3 :(得分:0)

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

无论如何,比较1.设备在物理上获得什么以及2.在读取功能工作后丢失到内存中的内容是有帮助的。

  1. 通过示波器观察 - 这是一个很短的字节序列,很容易在那里看到。

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

  3. 请包含任何结果并更新问题,以便任何人都能获得更多理解并提供更好的答案,

答案 4 :(得分:0)

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

之后会出现问题

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

断开功能是将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);
}