2009-07-15 62 views
1

整個上午我們一直在抨擊這一個。我們已經在嵌入式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,應該沒有理由將消息分解成兩個單獨的消息。

回答

3

我不明白你爲什麼感到驚訝。

您正在詢問至少一個字節。如果你的read()要求更多,這似乎很有可能,因爲你感到驚訝,你沒有在一次讀取中得到整個字符串,它可以得到任何可用的數據直到read()大小。但是所有的數據都不能在一次讀取中使用,因此您的字符串在讀取之間被切碎。

在這種情況下,計時器並不重要。只有至少有一個字節可用時,定時器纔會被設置。但是您已將最小值設置爲1.因此,它只是返回達到read()大小字節的任何字節數(> = 1)。

+0

你需要使用某種簡單的組幀方案。 – caf 2009-07-16 08:31:30

+0

我試過令人難以置信的高VTIME值,大約4或5秒。我嘗試過很多值。如果你參考http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html 3.2節的內容,你會明白我爲什麼會「驚訝」 – 2009-07-16 12:09:49

0

如果您仍然遇到此問題(實現的問題是舊的),你的代碼是準確的,你設置你的VTIME和VMIN在newtio結構,並在tio結構中的其他參數的其餘部分。