解決WPF軟體Arduino Leonardo串列埠通訊收不到問題
簡介:本來這應該是無比基礎的一個設計,然而卻讓我折騰了兩天
大致情況是這樣的,我寫了一個USB應用的工程,下位機是基於32U4的Leonardo,而我的上位機使用WPF來寫,然後在一切就緒之後,我發現我的程式碼並不能正常的運作,點擊發送卻收不到資料。
首先我試著檢查了執行緒的運作,並沒有發現問題,一切都很好,因為串列埠部分的處理和收發程式碼是我從上一個工程中拷貝的。
然後我試著檢測下位機的程式碼,並且加入了眾多的除錯語句,比如這樣的
Serial.print("Input Data: "); Serial.println(comdata); Serial.print("Input Data length: "); Serial.println(comdata.length());
還有這樣的。為了確認是不是發的太快導致Buffer部分可能出現問題,加了很長的延遲
if (Serial.available() > 0) { char c = Serial.read(); if (c == '1') { delay(10); Serial.println("Received 1"); } else if (c == '0') { delay(10); Serial.println("Received 0"); } delay(1000); Serial.println("Dat"); }
然而,結果是,我依然不能找到解決的方法,但是在IDE中我可以正常的收發資料,SSCOM(串列埠除錯助手)中也能正常收發,我試著將程式碼燒到一塊328P(UNO)上也可以正常的收發資料,因此,我認為原因並不是出自於下位機的程式碼如何,而是USB轉串列埠驅動方面與C#這邊相容性的問題。
而這個問題主要就是國產Leonardo這邊的問題了,因為沒有燒錄器沒法重新燒寫一遍bootloader,所以我暫時不能確定是否和這個有關係。
總結下目前狀態:
1.程式碼是正確的,因為328P上可以正常執行,使用非WPF+C#開發的串列埠除錯工具也能正常的收發
2.上位機軟體的收發程式碼是正確的
3.資料有正常的傳送到下位機,因為RX指示燈在傳送資料後有閃爍
如果要儘快解決這一個問題,我需要先找一個類似的可以正常接收的軟體,分析和我寫的有什麼區別。如果說WPF本身這個架構可能不相容,我應該先找一個類似的介面架構來檢查問題。
因為最接近WPF的還是winform,所以我從PUDN(程式設計師軟體開發網)上找到了幾個winform介面的串列埠除錯軟體,其中有一個能正常的使用
好的,經過確定這個軟體可以正常的接收我的下位機(Leonardo)所傳送的資料,並且顯示在文字框內
這會,我需要建立一個新的工程來將他的程式碼的核心部分移植出來並進行測試。建立了一個WPF工程後,繪製了簡單的介面,保留串列埠所應該有的必要的部分內容。一些串列埠的配置,包括波特率、停止位和校驗位,直接在程式中賦值。
將winform的介面相關程式碼轉換為wpf,軟體使用.NET 4我也在屬性中將我現有工程的.NET版本更改為4.0
沒有效果,那麼我需要重新找一下原因,是不是漏了什麼配置,我試著添加了while(!Serial)來使得我能夠判斷串列埠是否正常的開啟,也因此,最後,我發現是配置這塊的問題
Leonardo如果要開啟串列埠連線,必須接受一個復位訊號,而這個訊號預設是不傳送的!UNO等其他328P的晶片的板子則無需這個復位訊號。
整個問題緣於這個部分沒有配置
serialport.RtsEnable = true;
問題解決