2012-02-16 76 views
2

我有一個傳感器,它使用RS422通過串口吐出消息。 (我認爲這是正確的術語。)無論如何,我製作了線束,並將它連接到我的rs422轉換器和tada,我在超級終端中獲得了數據。好東西。100 Hz來自串口的數據

現在傳感器有一個奇數的波特率,1500kbps。我在Windows中這樣做,所以它實際上並沒有很難設置波特率。開始時,傳感器每10hz發送一個69字節的消息。我看到這條消息,正確的字節被讀取,並且消息非常準確(它包括等待它的時間戳,每個消息增加0.1s)。最重要的是,我在它的邊界上得到消息,換句話說,每一次閱讀都是一個新消息。

無論如何事情目前進展順利,所以我採取了下一步,我通過串口發送了一個寫命令來激活傳感器數據信息。該消息大小爲76字節,以100hz發送出去。再次成功,更多數據開始出現在讀取中。但是,我沒有得到它在100hz,我得到3968字節的塊。如果我降低緩衝區,我會得到三個非常非常快速的1024,然後立即讀取896(再次是3968字節)。 (請注意,我現在收到兩條消息,一條在10赫茲,大小爲69,另一條在100赫茲,長度爲76,請注意,兩條消息的組合均勻分割3968.)

我的問題是某處緩衝我的100hz信息,而且我沒有收到它們。我想改變這一點,但我不知道我在找什麼。我不需要它的邊界上有100Hz的信息,我只是不希望它在2Hz。我會很高興30hz甚至20hz。


下面我包括我的串行端口設置代碼:

端口打開

serial_port_ = CreateFile(L"COM6", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 

CommState和超時

COMMTIMEOUTS comm_timeouts; 
ZeroMemory(&comm_timeouts, sizeof(COMMTIMEOUTS)); 
//comm_timeouts.ReadIntervalTimeout = MAXDWORD; //Instant Read, still get 3968 chunks 
comm_timeouts.ReadIntervalTimeout = 1; //1ms timeout 
comm_timeouts.ReadTotalTimeoutConstant = 1000; //Derp? 
comm_timeouts.WriteTotalTimeoutConstant = 5000; //Derp. 
SetCommTimeouts(serial_port_, &comm_timeouts); 

DCB dcb_configuration; 
ZeroMemory(&dcb_configuration, sizeof(DCB)); 
dcb_configuration.DCBlength = sizeof(dcb_configuration); 
dcb_configuration.BaudRate = 1500000; 
dcb_configuration.ByteSize = 8; 
dcb_configuration.StopBits = ONESTOPBIT; 
dcb_configuration.Parity = ODDPARITY; 
if(!SetCommState(serial_port_, &dcb_configuration)) 

我讀

if(!ReadFile(serial_port_, read_buffer_, 1024, &bytes_read, NULL)) 
+1

下面你什麼也沒有包括 – leppie 2012-02-16 16:24:14

+0

不得不改變電腦,直到它已經太遲了才意識到它 – Constantin 2012-02-16 16:26:39

回答

3

我會懷疑你的serial-> usb轉換器做緩衝。由於USB是基於數據包的,它需要做一些緩衝。在10Hz的速率下,可能會有足夠大的延遲,在每條消息之後刷新緩衝區。但在100Hz時,消息已經到來,它正在通過其他邏輯刷新緩衝區。

這有道理嗎?

+0

它的確如此,這也是我的想法。不過,我是串口編程的新手,所以我不想做出這樣的假設。如果確實如此,我該如何解決它?有沒有辦法爲串口設置系統緩衝區? api調用可能會影響串行轉換器驅動程序,是否有Windows api調用來設置通信緩衝區?我的觀點是,我們知道轉換器能夠達到10HZ,至少可以做到這一點。不是2 HZ – Constantin 2012-02-16 16:31:54

+4

我看了一次(類似的應用程序)。有關USB轉換器的功能的詳細說明,請參見http://www.ftdichip.com/Support/Documents/AppNotes/AN232B-04_DataLatencyFlow.pdf第3.1節。該文件用於FTDI FT232,但我認爲其他人的工作原理類似。 (還有其他有用的應用筆記)如果您使用的是FT232設備,則可以設置此延遲計時器。我相信它也可以在Windows中完成,但我從來沒有嘗試過。對於Linux,您可以使用http://www.intra2net.com/en/developer/libftdi/documentation/group__libftdi。html#ga3e0227b0c7aa859d2d2afb5ffa4c8466 – rve 2012-02-16 18:45:42

+2

發現它適用於FT232設備的windows,它在AN_107高級驅動程序選項中:http://www.ftdichip.com/Support/Documents/AppNotes/AN_107_AdvancedDriverOptions_AN_000073.pdf – rve 2012-02-16 18:50:08