最有有個項目,用到了PC104的板子(PCM-3341),Linux的系統。
但是在項目中至少要用到3個RS232,看datasheet,夠用。板子有3個獨立的RS232和一個RS232/485復用口。但是在實際測試用,遇到個問題。1口和2口都能正常工作(後來發現也是有問題的,讀傳感器數據的時候,讀不完全),但是3口和4口卻出現了很奇怪的現象。
主要表現為:
1.可以輸入輸出
2.輸入輸出速率很慢
3.發現數據在緩存裡頭,每次大概只能輸出12個字符左右(不確定的長度)。
開始一直沒有找到原來,後來咨詢別的技術人員,估計是中斷問題。
以google發現了下面的文章:原始出處,問題解決了,很感謝高手的指點。可惜還沒來得及去深入。
LINUX默認支持四個串口:COM1(ttyS0),COM2(ttyS1),COM3(ttyS2),COM4(ttyS3)(較新的linux中已不使用cuaX來區分撥入撥出),通常情況下,COM1和COM3共同使用IRQ4,COM2和COM4共同使用IRQ3。
雖然LINUX支持共享中斷技術,但它無法發現實際的物理中斷沖突。在上述情況下,COM3和COM4因為中斷沖突而無法正常使用。本文介紹了如何在Red Hat 8.0環境下使用COM3和COM4。
由於當前開發項目需要同時使用四個串口,而所用的開發用工控機恰好有四個,省去了買多口卡的麻煩,直接編程使用了COM3和COM4。當進行測試時,問題出現了:COM3和COM4收發數據非常的慢,幾個BYTES的數據在115.2K的通訊速率下要一二十秒才能發出或收到,完全不能滿足對應用的要求。
通過查檢資料,確認這是一種典型的中斷沖突故障,使用方法如下:
setserial /dev/ttyS2 irq 0
再使用通訊程序,現在數據傳輸就看不到有明顯的延遲了。這是由於將COM3設置為irq0中斷時,設備實際上並未使用中斷,而是使用了polling技術,從而證明了故障是由於中斷機制造成的,有沖突發生。
主板上COM3和COM4的跳線表明可使用IRQ5和IRQ7,於是設置好跳線並運行
setserial /dev/ttyS2 irq 5
setserial /dev/ttyS2 irq 7
使用通訊程序,發現故障依然,懷疑仍有沖突。查閱資料知,IRQ5和IRQ7通常為並口使用,但當前系統未使用並口啊。進入BIOS發現裡面設置了並口並占用IRQ7,將該項DISABLE掉。似乎和IRQ5沒多大關系,發現設置中IRQ5和7為"PCI/ISA PnP",改為"Legacy ISA"方式後,重啟,COM1--COM4均可正常使用。