none
C# SerialPort 沒有任何回傳值 RRS feed

  • 問題

  • 各位前輩好

    最近在寫SerialPort的通訊遇到一個問題想請教各位前輩

    原先有一隻舊程式(用C++開發的),可以正常透過SerialPort讀寫都沒問題

    然後我用C# SerialPort要寫一樣的程式,

    但我在送出Command之後,DataReceived事件沒有觸發,BytesToRead()讀回來也都是

    原本懷疑是Command格式送錯所以沒有任何回應

    不過後來有用Device Monitoring Studio 這個軟體去監看

    確認舊程式送出的Command與我送出Command格式是一樣的

    但舊程式可以正確讀到回傳值,我自己下的確怎麼讀都是空白

     

     

    我自己比較懷疑有問題的幾個點

    1.包率參數設定錯誤,因為設定是看舊程式介面上參數照著設定,會不會其實介面顯示的跟實際連線用的不同

     

    2.Command格式需要做顛倒之類的,因為我記得以前有遇過讀取回來的值會有高低位元差異,有時候要反向
    不知道送出是不是也可能有這個問題

     

    3.ENQ、STX這類型隱藏的Byte資料沒有送,這部分我用監看軟體看送出的Byte資料、和手冊上的資料
    我確定我的新程式與舊程式送出的Byte資料都是一樣(從監控軟體看起來都一樣)、順序也都沒錯

     

     

    目前我自己是覺得跟Command格式錯誤的關係比較小

    我通訊的硬體是三菱的PLC,我以前的經驗是就算Command送錯

    也不應該沒有任何回傳值,應該會有個錯誤代碼之類的才對

    之前也想說是不是.Net FrameWork沒有裝好,後來也直接下載4.6再裝一次,但結果還是一樣

    想請教各位前輩有沒有類似經驗可以跟我分享、目前實在沒什麼頭緒還可以往哪邊去查


    • 已編輯 open852134 2017年11月27日 上午 06:24
    2017年11月27日 上午 03:47

解答

  • 其他的猜測,是否是因為 RTS 或 DTR 必須 enable ? 猜的,你可以試試看。

    SerialPort.DtrEnable 屬性

    SerialPort.RtsEnable 屬性


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年11月27日 下午 04:22
    版主

所有回覆

  • 有code能看嗎? 這樣講,很難知道哪裡有錯

     

    建議可以參考 茂伯大 

    Serial Port 系列(1) 關於Serial Port的基本認識的教學例子 他也是 DataReceived 去寫的。 

    我也是研究通訊門禁軟體的,下錯命令,它不吃,我這是不會回傳錯誤訊息。

    鮑率我常常設定錯誤,指令下對,它會回傳錯誤的訊息回來。

    有試過單獨用write 和read回來嗎? 或換一台機器試試? 線路是USB?232?485?


    2017年11月27日 上午 08:33

  • 1. 新增:在通訊迴路上掛個封包監聽電腦,並確認會持續讀取監聽,一般是使用監聽軟體直接送一次命令後,就會持續監聽。

    2. 你開發電腦用原裝軟體發送資料,比對監聽電腦是不是有正確監聽到收發。

    3. 你的軟體發送資料,比對是否有收發。

    a. 有收發:通常你的接收緩衝區出問題,例如觸發位元數太高,或是緩衝區開太小。

    b. 無收發:請參考硬體說明,是否有特殊時間間隔限制,更多問題,請洽硬體商,可能是硬體鎖。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月27日 下午 03:53
  • 其他的猜測,是否是因為 RTS 或 DTR 必須 enable ? 猜的,你可以試試看。

    SerialPort.DtrEnable 屬性

    SerialPort.RtsEnable 屬性


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年11月27日 下午 04:22
    版主
  • 非常感謝各為前輩提供的建議

    這邊先補上我的部分Code,主要就是Write CMD後 Sleep(100) 然後再去Read

    那問題點就是Read部分完全沒有值(因為硬體不再身邊,不然就可以看一下訊號燈到底有沒有回應...)

    我自己印象也是如果鮑率設錯還是會回傳東西,頂多就是資料很怪沒辦法解碼

    造目前看起來,感覺是少下什麼CMD或是下錯

    導致根本硬體根本沒有裡我送出的CMD也理所當然沒有任何回傳值的感覺

     

    感謝pigpp大大 以及 心冷熱情熄大大 提供的意見我會再試試看

    RTS 或 DTR的Enable這我真的是沒試過!!  感謝Bill Chung大大提供的意見

    string SendCMD_1 = ENQ + "00FFWR0D00000F" + CR + LF;
    
    byte[] byteArray = System.Text.Encoding.Default.GetBytes(SendCMD_1);
    port.Write(byteArray, 0, byteArray.Length);
    Thread.Sleep(100);
    
    int iBytesToRead = port.BytesToRead;
    char[] receiveBytes = new char[iBytesToRead];
    port.Read(receiveBytes, 0, receiveBytes.Length);
    
    string mm = new String(receiveBytes);


    2017年11月28日 上午 07:15
  • 一般而言還是用事件或迴圈來收資料,因為 100ms 有點短...

    你如果懶得改程式,建議你先用 500ms 。

    傳輸大概 30ms

    判斷為訊號到開始處理大概 100ms

    回傳 30ms

    你電腦處理接收緩衝區 50ms

    你程式碼還要時間。

    所以 500ms 通常睡夠了,但 100ms 可能還沒睡夠。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年11月28日 下午 03:48
  • 回復一下最後測試的結果,真的是在設定

    SerialPort.DtrEnable 
    SerialPort.RtsEnable 

    這兩個參數Enable起來後真的可以了!!!!!!

    太感謝各為前輩幫忙跟建議了

    2017年11月29日 上午 05:50