2009-06-19 75 views
1

我們有一個運行XP嵌入式系統,COM2是一個硬件RS485端口。嵌入式Windows XP - RS485問題

在我的代碼中,我使用RTS_CONTROL_TOGGLE設置了DCB。我會假設它會做它所說的......一旦發生空寫中斷,關閉內核模式下的RTS。這應該幾乎是瞬間的。我們在一個範圍內看到,PC正在驅動總線,比信息的末尾長1-8毫秒。我們正在與之通話的設備的響應時間約爲1至5毫秒。所以......傳播腐敗盛行。不,沒有辦法改變目標的響應時間。

我們現在已經連接到RS232端口,並將示波器連接到TX和RTS線路,我們看到了同樣的事情。消息發送後,RTS線保持高1-8毫秒。

我們也嘗試關閉FIFO,或將FIFO深度設置爲1,但不起作用。

任何想法?我將在「SendFile,clear RTS」週期期間嘗試使用REALTIME優先級從用戶模式手動控制RTS線路。我沒有太多的希望,這也可以工作。這不應該在用戶模式下完成。

+1

我討厭在嵌入式開發問題時可以在任何地方找到有限的支持。理學士在計算機工程,EIT和我正在做的.Net開發全職,而我渴望與我的開發板和fpgas修補,希望工具和支持嵌入式開發不久的將來會好起來。 但我希望你在這個問題上運氣。 – marr75 2009-06-19 15:28:22

回答

4

RTS_CONTROL_TOGGLE不工作(具有發射後,將其關閉之前,變量1-15毫秒的延遲)對我們的嵌入式XP平臺。如果我使用timeBeginPeriod(1)等將時間量程改爲1 ms,那麼我可能會弄錯它,但是我懷疑它是否可靠或足夠重要。 (設備有時會響應1毫秒)

最終的解決方案確實很醜,但它在這個硬件上工作。我不會在任何硬件不固定的地方使用它。

基本上是:

1)設置FIFO的串行端口的設備管理器頁面上關閉或1個字符深

2)使用這個代碼發送郵件+ 2個額外的字節

int WriteFile485(HANDLE hPort, void* pvBuffer, DWORD iLength, DWORD* pdwWritten, LPOVERLAPPED lpOverlapped) 
{ 
    int iOldClass = GetPriorityClass(GetCurrentProcess()); 
    int iOldPriority = GetThreadPriority(GetCurrentThread()); 
    SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); 
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); 

    EscapeCommFunction(hPort, SETRTS); 

    BOOL bRet = WriteFile(hPort, pvBuffer, iLength, pdwWritten, lpOverlapped); 

    EscapeCommFunction(hPort, CLRRTS); 

    SetPriorityClass(GetCurrentProcess(), iOldClass); 
    SetThreadPriority(GetCurrentThread(), iOldPriority); 

    return bRet; 
} 

當最後一個或兩個字節寫入串行端口時,WriteFile()會返回。他們還沒有離開端口,因此需要發送2個額外的字節。當您執行CLRRTS時,其中一個或兩個人都會被破壞。

就像我說的...這很醜。

1

任何想法?

您可能會發現有一個爲在DDK中的串口驅動程序,這將讓你看到這個選項應該如何實現源代碼:即無論是在中斷級別,在DPC級,或更差。

其他可能性包括重寫驅動程序;使用第三方RS485驅動程序,如果你能找到一個;或者使用第三方RS485硬件和其自己的驅動程序(例如,至少在過去用於製作具有32個端口,深度緩衝區和自己的微處理器的「智能串行端口板」的第三方;我期望RS485是一個問題由某人解決)。

8毫秒似乎確實是一個令人失望的長時間;我知道XP不是RTOS,但我希望它(通常)比這更好。另一個要看的是是否有其他高優先級的線程正在運行,這可能會造成干擾。如果您在自己的應用程序中提高了某些線程的優先級,或許應該降低其他線程的優先級。

即將嘗試在「SendFile,清除RTS」週期期間嘗試使用REALTIME優先級從用戶模式手動控制RTS線路。

不要讓那個線程失去控制:IME是一個像這樣的線程,如果它有錯誤,它會永遠搶佔所有其他用戶模式線程。

+0

是的,但是如果你在那一節所做的是「SendFile,EscapeCommFunction(CLRRTS)」,那麼它不應該是越野車,不是?只要你發送的緩衝區有時不是NULL或任何東西。這應該是安全的。我會明白的。 :) – darron 2009-06-19 15:51:59

+0

這是一個同步的SendFile,我接受它。如果該線程在從EscapeCommFunction返回時不阻塞甚至不睡覺任何東西(如果相反,它只是循環),那麼將出現「Buggy」。 – ChrisW 2009-06-19 16:16:54