读取串口返回我刚写的内容

时间:2016-04-26 15:54:33

标签: c++ linux serial-port

我刚刚开始了一个项目,我现在正在努力解决串口问题。我写了一个静态库,它可以处理所有的串行例程,并提供一个带有“readLine()”和“writeLine()”函数的接口。 写入和读取时都能完美运行(顺便说一下),除非奴隶在获取数据后没有回复,然后将数据发回给我,我就读了。

我用O_NDELAY打开我的fd,并使用fcntl将我的读取系统调用配置为非阻塞。

这里有两个完全不同的螺纹环。

void *Serial_Port::readLoop(void *param)
{
  Serial_Port *sp = static_cast<Serial_Port*>(param);
  std::string *line = NULL;
  char buffer[128];

  while (1)
    {
      line = new std::string();
      while ((line->find("\r\n")) == std::string::npos)
        {
          usleep(100);
          bzero(buffer, 128);
          pthread_mutex_lock(sp->getRLock());
          if (read(sp->getDescriptor(), buffer, 127) > 0)
            *line += buffer;
          pthread_mutex_unlock(sp->getRLock());
        }
      pthread_mutex_lock(sp->getRLock());
      sp->getRStack()->push(line->substr(0, line->find("\r\n")));
      pthread_mutex_unlock(sp->getRLock());
      delete (line);
    }
  return (param);
}

void *Serial_Port::writeLoop(void *param)
{
  Serial_Port *sp = static_cast<Serial_Port*>(param);
  std::string *line;

  while (1)
    {
      line = NULL;
      pthread_mutex_lock(sp->getWLock());
      if (!sp->getWStack()->empty())
        {
          line = new std::string(sp->getWStack()->front());
          sp->getWStack()->pop();
        }
      pthread_mutex_unlock(sp->getWLock());
      if (line != NULL)
        {
          pthread_mutex_lock(sp->getWLock());
          write(sp->getDescriptor(), line->c_str(), line->length());
          // fsync(sp->getDescriptor());                                                                                                                                                                                                                                       
          pthread_mutex_unlock(sp->getWLock());
        }
      usleep(100);
    }
  return (param);
}

我尝试刷新文件描述符,但在执行此操作后我无法接收任何数据。我怎样才能摆脱那些重复的,不必要的数据?

感谢。

1 个答案:

答案 0 :(得分:1)

经过多次测试和行为分析,我发现它是“Pulsar3”(我连续使用的设备)不断给我回复我发送的“Acknowledge”。很高兴知道!