在串口上读取 returns 我刚写的

Reading on serial port returns what i just wrote

我刚刚开始了一个项目,从现在开始我就在为串行端口而苦苦挣扎。我写了一个静态库,它可以处理所有的串行例程,并提供一个带有 "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);
}

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

谢谢。

经过多次测试和行为分析,我发现是 "Pulsar3"(我在串口上使用的设备)不断返回我作为 "Acknowledge" 发送的内容。很高兴知道!