从3g调制解调器

时间:2017-03-04 09:12:39

标签: c linux embedded

我正在为我的路由器中嵌入的3g调制解调器开发监视器。 它在linux系统中作为/ dev / ttyUSB设备接口。

我需要使用非阻塞读取,我将使用select()。 这是代码:

    df = open(MODEMDEVICE, O_RDWR|O_EXCL);
if (df <0) {perror(MODEMDEVICE); exit(-1); }

tv.tv_sec = 5;
tv.tv_usec = 0;

FD_ZERO(&rfds);
FD_SET(df, &rfds);

while (1) {
    retval = select(df+1, &rfds, NULL, NULL, &tv);
    if (retval == -1)
        perror("select()");
    else if (retval) {
        rdnum=read(df, rdbuf, MSGBUFFSIZE-1);
        rdbuf[rdnum]='\0';
        if (rdnum == 1)
            printf("data available(%i-%i): 0x%02x\n",retval , rdnum, rdbuf[0]);
        else
            printf("data available(%i-%i):%s\n",retval , rdnum, rdbuf);
        usleep(200000);
    } else
        printf("No data within five seconds.\n");

}

但输出就是这个:

data available(1-1): 0x0a
data available(1-1): 0x0a
data available(1-17):+PSBEARER: 24, 8

data available(1-1): 0x0a
data available(1-1): 0x0a
data available(1-1): 0x0a
data available(1-17):+PSBEARER: 24, 3

data available(1-1): 0x0a
data available(1-1): 0x0a
data available(1-1): 0x0a
data available(1-17):+PSBEARER: 24, 8

data available(1-1): 0x0a
data available(1-1): 0x0a
data available(1-1): 0x0a
data available(1-17):+PSBEARER: 24, 3

似乎每次调用select()时它都会立即返回,当调用read()时,如果没有可用的真实数据,则返回0x0a(换行符)。

通过使用picomm,我得到:

+PSBEARER: 24, 8

+PSBEARER: 24, 3

+PSBEARER: 24, 8

+PSBEARER: 24, 3

它没有显示换行符,并且在&#34; + PSBEARER之后有一个更大的延迟:24,3&#34;代码。

我哪里错了? 感谢。

1 个答案:

答案 0 :(得分:1)

您的串行设备处于“熟”模式,使用tcgetattr()/ cfmakeraw()/ tcsetattr()将其设置为raw。使用这样的代码:

 fd = open(dev, O_RDWR);
 if (fd > 0 && isatty(fd)) {
      if (tcgetattr(fd, &tty) < 0)
           fprintf(stderr, "Can't get tty attributes\n");
      else {
           cfmakeraw(&tty); /* set to "raw" mode */
           if (tcsetattr(fd, TCSADRAIN, &tty) < 0)
                fprintf(stderr, "Can't set tty attributes\n");
      }
 }