我正試圖做一個串行通信應用程序。我有一個運行angstrom qt linux映像的設備。我需要爲該設備編寫串行代碼應用程序。由於交叉編譯器是爲QT4.8.7設置的,所以它不包含QSerialPort
。所以我正在關注這個串行通信的link,我也發現了很多很好的例子。如何在Linux中從串口接收完整數據
下面是代碼:
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創作者中引導它。我面臨的問題是每當我發送像A
或B
或任何其他單個字符的字符。它收到它。但是當我發送完整的字符串時,它會自動中斷。看看下面的圖片:
正如你可以在圖片中看到,它接收燒焦像p
l
h
但後來我送hello world
。它打破它,首先收到hello
,然後world
。我再次發送hello world
它收到he
然後然後worl
然後d
。爲什麼會顯示這種行爲。請幫忙。謝謝。
'error:expected;之前長度:) :) – CZAbhinav
@CZAbhinav感謝您的快速擡頭:) – Rogus
@羅格斯它沒有打印任何東西在終端上。即使是recive ok –