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