2014-04-24 107 views
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

回答

2

在C中,「字符串」需要爲0 - 終止。

如果它們之前沒有被處理(打印在這裏)程序運行到未定義的行爲。這也可能導致「垃圾」被打印。

爲了解決這個問題使用它,這樣做很容易前初始化用於所有0 S上的緩衝:

char buffer[255] = ""; 

而且read()回報ssize_t沒有int。所以你最好這樣做:

ssize_t nbytes; 
+0

謝謝,這解決了日誌中垃圾的問題。但是,雖然ioctl細分市場看起來真的很腥。有什麼辦法可以將它移動到閱讀週期? – StalkerRus

+0

使用'select()','poll()'或'epoll()'來檢測描述符中是否存在某種東西(這裏可以讀取的東西)。 @StalkerRus – alk