none
[VB.2015] SerialPort 接收不到正確值 RRS feed

  • 問題

  •         '元件設定
    	Me.SerialPort1.BaudRate = 115200
    	Me.SerialPort1.DataBits = 8
            Me.SerialPort1.DiscardNull = True
    	Me.SerialPort1.DtrEnable = False
    	Me.SerialPort1.GenerateMember = True
    	Me.SerialPort1.Handshake = None
    	Me.SerialPort1.Modifiers = Friend
    	Me.SerialPort1.Parity = None
    	Me.SerialPort1.ParityReplace = 63
    	Me.SerialPort1.PortName = COM1
    	Me.SerialPort1.ReadBufferSize = 4096
    	Me.SerialPort1.ReadTimeout = -1
    	Me.SerialPort1.ReceivedBytesThreshold = 1
    	Me.SerialPort1.RtsEnable = False
    	Me.SerialPort1.StopBits = One
    	Me.SerialPort1.WriteBufferSize = 2048
            Me.SerialPort1.WriteTimeout = 1000
            '

    '接收處理

    Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived If IsCanSeeMSG = 1 Then '啟動回應 ReceivedText(SerialPort1.ReadExisting()) End If End Sub Public Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting If Me.inputPort.InvokeRequired Then Dim x As New SetTextCallback(AddressOf ReceivedText) Me.Invoke(x, New Object() {(text)}) Else Me.inputPort.Text &= [text] 'append text End If End Sub

    這程式能正常接收到 速率 9600 的 DOS終端機訊息 , 但是 DOS終端機速率如果調到 115200 ,系統就無法正確抓到了
    但在 teraterm 及 putty 又能正確抓到 , 故懷疑 是程式端有寫錯.... 

    小弟我 真的搞了好幾個月 各種教學文都有仔細查閱過了...但就一直卡在這關... 懇求各位大師協助解答 謝謝!

    這是發送代碼 , 也一樣 送出去後 遠端機器只有抓到 第一個值 , 但在 9600速率下又沒這問題 , 是不是程式有寫錯?

                        Dim bytes() As Byte = {&H1B, &H5B, &H30, &H6E}              '回應[5n
                        Form1.SerialPort1.Write(vbCr)
                        Form1.SerialPort1.Write(bytes, 0, bytes.Length)                '發送
                        Form1.SerialPort1.Write(vbCr)


    • 已編輯 月神之翼 2016年5月20日 上午 03:19 更正標題
    2016年5月20日 上午 01:04

解答

  • .Net 海角點部落 serialport 系列

    建議你可以看一遍這個系列文


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

    • 已標示為解答 月神之翼 2016年5月24日 上午 03:53
    2016年5月21日 下午 03:32
    版主
  • Me.SerialPort1.ReceivedBytesThreshold = 1

    這行決定收到 1 byte 就觸發事件 SerialPort1_DataReceived

    不要在事件內做迴圈,Net 在接收事件是採用多緒觸發,也就是說每一次 執行緒 輪流執行時,會再觸發一次事件,兩次事件同時讀取 SerialPort1 就會造成錯誤。

    把上次回覆引用的這篇看懂:[.Net] 資料接收的常識

    特別是慢的部分,程式碼執行的速度比資料傳輸的速度快太多倍,再來多緒的時間不同步要仔細畫一下。


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

    • 已標示為解答 月神之翼 2016年5月24日 上午 03:53
    2016年5月21日 下午 03:35

所有回覆

  • 先前你這篇就有回你硬體限制部分:

    https://social.msdn.microsoft.com/Forums/zh-TW/32048a29-8f13-4bdb-bb9a-86c8ff76ae47/serialport-?forum=232#32048a29-8f13-4bdb-bb9a-86c8ff76ae47

    你查過你的線材、硬體本身支援 115200 嗎?設備端是自動跳鮑率還是要手動設定?


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

    2016年5月20日 下午 03:38
  • 你的接收方式先前那篇也跟你說過,你的寫法是錯誤的,你並沒有用迴圈檢查接收緩衝區,只收到第一個位元組也是剛剛好。

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

    2016年5月20日 下午 03:40
  • 硬體和線材都確認過了 , 所以才認定問題點在程式端
    2016年5月21日 下午 03:19
  • 大大的意思是指 在 SerialPort1_DataReceived 建立迴圈檢查嗎?
    這部分能再詳細說明 , 我對於這塊完全不能理解 , 謝謝!
    2016年5月21日 下午 03:21
  • .Net 海角點部落 serialport 系列

    建議你可以看一遍這個系列文


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

    • 已標示為解答 月神之翼 2016年5月24日 上午 03:53
    2016年5月21日 下午 03:32
    版主
  • Me.SerialPort1.ReceivedBytesThreshold = 1

    這行決定收到 1 byte 就觸發事件 SerialPort1_DataReceived

    不要在事件內做迴圈,Net 在接收事件是採用多緒觸發,也就是說每一次 執行緒 輪流執行時,會再觸發一次事件,兩次事件同時讀取 SerialPort1 就會造成錯誤。

    把上次回覆引用的這篇看懂:[.Net] 資料接收的常識

    特別是慢的部分,程式碼執行的速度比資料傳輸的速度快太多倍,再來多緒的時間不同步要仔細畫一下。


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

    • 已標示為解答 月神之翼 2016年5月24日 上午 03:53
    2016年5月21日 下午 03:35
  • 小弟的問題解決了 , 特別跟大家報告一下

    問題出在我的 SerialPort1.DTR是False , 所以才會產生一堆問題 , 後來把 SerialPort1.DTR功能調整成True

    傳送及接收都正常了 , 不過也很感謝樓上各位的指明 , 下一版的程式 應該會盡可能的採用上面推薦的方式改謝

    以上

    P.S. 雖然我不知道DTR這功能是什麼 , 剛好看到有人提到 試著將 DtrEnable RtsEnable 設為 Enable  然後下方也有提到

    IOCTL_SERIAL_SET_WAIT_MASK , IOCTL_SERIAL_WAIT_ON_MASK , 所以就試著調整了 , 問題也幾乎解決了

    軟體要與硬體溝通 果然深澳

    2016年5月26日 上午 02:54
  • 有些通訊要判斷 DTR , 當 DTR 電位升高, 就代表"準備好接收資料"的意思

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

    2016年5月26日 上午 10:17
    版主