我正在尝试将调制解调器切换到命令模式,写入AT命令并解析响应,但我对C不太好,我不明白有什么问题。我打电话的代码是:
void switch_to_command_mode(int uart)
{
current_command_type = BTCommandTypeSwitchToATMode;
char switchCmd[] = "\x2F\x2F\x2F";
char emptySymbol[] = " ";
char checkAT[] = "AT\r";
ssize_t len = 0;
write(uart, emptySymbol, strlen(emptySymbol));
sleep(1);
write(uart, switchCmd, strlen(switchCmd));
sleep(1);
write(uart, checkAT, strlen(checkAT));
char buffer[255]; /* Input buffer */
char *bufptr; /* Current char in buffer */
int nbytes;
bufptr = buffer;
while (ioctl(uart, FIONREAD, (unsigned long)&len) == 0 && len < 2) {
warnx("waiting");
usleep(1000);
}
while ((nbytes = read(uart, bufptr, buffer + sizeof(buffer) - bufptr - 1)) > 0)
{
bufptr += nbytes;
warnx("buffer %s", buffer);
if (bufptr[-1] == '\n' || bufptr[-1] == '\r')
break;
}
warnx("Final buffer: %s", buffer);
if (strncmp(buffer, "OK", 2) == 0) {
warnx("Great success!");
}
}
我得到的控制台输出是:
waiting
waiting
buffer AT
O p �0
buffer AT
OK
�0
Final buffer: AT
OK
�0
根据BT模块的文档,响应应采用<CR><LF>OK<CR><LF>
。
任何关于为什么会发生这种情况的指导以及我能做些什么都将受到高度赞赏。
P.S。我也已经完成了Serial programming for POSIX OS。
答案 0 :(得分:2)
在C中,“字符串”需要0
- 终止。
如果它们在处理之前(在此处打印),则程序会运行到未定义的行为。这也可能导致“垃圾”被打印出来。
要解决此问题,请在使用之前轻松初始化用于所有0
的缓冲区,方法是:
char buffer[255] = "";
同样read()
返回ssize_t
而不是int
。所以你最好这样做:
ssize_t nbytes;