【发布时间】:2017-09-12 21:04:49
【问题描述】:
我正在尝试做一个串行通信应用程序。我有一个运行 angstrom qt linux 映像的设备。我需要为该设备编写串行代码应用程序。因为交叉编译器是为QT4.8.7设置的,所以不包括QSerialPort。所以我关注这个link 进行串行通信,我也找到了很多很好的例子。
下面是代码:
void MainWindow::SerialOpen(QString PORT)
{
fd = open(PORT.toStdString().c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
perror("open_port: Unable to open /dev/ttyLP0\n");
exit(1);
}
saio.sa_handler = signal_handler_IO;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
fcntl(fd, F_SETFL, FNDELAY);
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL, O_ASYNC );
tcgetattr(fd,&termAttr);
cfsetispeed(&termAttr,B9600);
cfsetospeed(&termAttr,B9600);
termAttr.c_cflag &= ~PARENB;
termAttr.c_cflag &= ~CSTOPB;
termAttr.c_cflag &= ~CSIZE;
termAttr.c_cflag |= CS8;
termAttr.c_cflag |= (CLOCAL | CREAD);
termAttr.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
termAttr.c_iflag &= ~(IXON | IXOFF | IXANY);
termAttr.c_oflag &= ~OPOST;
tcsetattr(fd,TCSANOW,&termAttr);
qDebug("Serial Port configured....\n");
}
为了阅读,我正在使用:
void signal_handler_IO (int status)
{
char buf [100];
int n = read (fd, buf, sizeof buf);
if(n > 0)
{
buf[n] = '\0';
printf("Receive OK %s\n",buf);
}
}
我正在使用基于事件的串行读取。我在 QT creator 中编写它。我面临的问题是,每当我发送 A 或 B 或任何其他单个字符之类的字符时。它接收它。但是当我发送完整的字符串时,它会自动中断。请看下图:
正如您在图片中看到的,它接收到类似p l h 的字符,但后来我发送了hello world。它打破了它,首先收到hello,然后是world。我再次发送了hello world,它收到了he,然后是llo,然后是worl,然后是d。为什么这显示这种行为。请帮忙。谢谢。
【问题讨论】:
标签: c++ linux serialization