我刚刚开始了一个项目,我现在正在努力解决串口问题。我写了一个静态库,它可以处理所有的串行例程,并提供一个带有“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);
}
我尝试刷新文件描述符,但在执行此操作后我无法接收任何数据。我怎样才能摆脱那些重复的,不必要的数据?
感谢。
答案 0 :(得分:1)
经过多次测试和行为分析,我发现它是“Pulsar3”(我连续使用的设备)不断给我回复我发送的“Acknowledge”。很高兴知道!