我有一個傳感器,它使用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))
下面你什麼也沒有包括 – leppie 2012-02-16 16:24:14
不得不改變電腦,直到它已經太遲了才意識到它 – Constantin 2012-02-16 16:26:39