整個上午我們一直在抨擊這一個。我們已經在嵌入式Linux設備和Ubuntu盒子之間建立了一些串行線路。因爲我們的代碼通常會返回兩個(有時更多,有時只是一個)消息讀取,而不是每發送一個實際消息讀取一條消息,所以我們的讀取被搞砸了。Linux termios VTIME不工作?
這裏是打開串口的代碼。 InterCharTime被設置爲4
void COMClass::openPort()
{
struct termios tio;
this->fd = -1;
int tmpFD;
tempFD = open(port, O_RDWR | O_NOCTTY);
if (tempFD < 0)
{
cerr<< "the port is not opened"<< port <<"\n";
portOpen = 0;
return;
}
tio.c_cflag = BaudRate | CS8 | CLOCAL | CREAD ;
tio.c_oflag = 0;
tio.c_iflag = IGNPAR;
newtio.c_cc[VTIME] = InterCharTime;
newtio.c_cc[VMIN] = readBufferSize;
newtio.c_lflag = 0;
tcflush(tempFD, TCIFLUSH);
tcsetattr(tempFD,TCSANOW,&tio);
this->fd = tempFD;
portOpen = true;
}
另一端的配置類似於用於通信,並且具有特定iterest之一小部分:
while (1)
{
sprintf(out, "\r\nHello world %lu", ++ulCount);
puts(out);
WritePort((BYTE *)out, strlen(out)+1);
sleep(2);
} //while
現在,當我運行在接收計算機上的讀出線程,「你好世界」通常會通過幾條消息而分解。以下是一些示例輸出:
1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3
其中number後跟一個冒號是一個消息收到。你能看到我們正在犯的任何錯誤嗎?
謝謝。請致電section 3.2 of the Linux Serial Programming HOWTO。根據我的理解,用幾秒鐘的VTIME(意味着vtime設置在10到50之間的任何地方,試錯)以及1的VMIN,應該沒有理由將消息分解成兩個單獨的消息。
你需要使用某種簡單的組幀方案。 – caf 2009-07-16 08:31:30
我試過令人難以置信的高VTIME值,大約4或5秒。我嘗試過很多值。如果你參考http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html 3.2節的內容,你會明白我爲什麼會「驚訝」 – 2009-07-16 12:09:49