我的源代码中发生了一些非常奇怪的事情。 以下功能运行良好,打印出来的' 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进入命令模式并在密码错误时断开用户连接非常重要。 请帮我解决问题。任何想法都赞赏!
答案 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;
}
}
}
}