1
我试图将调制解调器切换到命令模式,写AT命令并解析响应,但我对C不太好,我不明白是什么错。我打电话的代码是:读写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。
谢谢,这解决了日志中垃圾的问题。但是,虽然ioctl细分市场看起来真的很腥。有什么办法可以将它移动到阅读周期? – StalkerRus
使用'select()','poll()'或'epoll()'来检测描述符中是否存在某种东西(这里可以读取的东西)。 @StalkerRus – alk