2014-04-24 79 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