none
rs232 接收速度? RRS feed

  • 問題

  • 小弟目前是用vb6一個com來傳送接收一個Deivce的資料,傳送出去的command沒有問題,但收到的回覆只有22byte卻要約2-4秒,速度很慢,提升baud rate 9600→19200→38400收到的時間都是一樣,但是用它本身的程式來讀取數值是很快的(不用一秒)

    mscomm的設定

    comport:5

    Baud rate : 9600,n,8,1

    handshanking: none

    inputlen:0

    inputmode:Bainary

    rthreshold:1

    sthreshold:1

    接收資料程式碼:

        Select Case MSComm1.CommEvent

        Case comEvReceive

            Dim inData() As Byte

            inData = MSComm1.Input

            For i = 0 To UBound(inData)

                List1.AddItem inData(i)

            Next i

        End Select

    2011年10月26日 上午 06:30

解答

  • 發送要時間,設備回應命令要時間,接收要時間。

    設 9600 也不見得全速再跑。

    程式沒寫好,1 byte 1 byte 從緩衝區讀出來,也比一次讀出來時間要久。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月31日 下午 12:31

所有回覆

  • 先用一般工具去測,看是設備問題還是你程式問題。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月26日 下午 02:28
  • 設備確定是沒問題,因為用別的軟體去收沒有這個問題。

    程式我看來也找不出問題在那?但確實就是收的比較慢,試過收其它設備不會有這種情形。

    2011年10月27日 上午 12:15
  • 一般來說會慢,可能是通訊Rate沒有設對,要Check一下哦!

    另外就是使用Timer(設300 or 500)去收input的值,然後用一個全域變數去接,再判斷結束符號!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年10月27日 上午 01:44
  • 我是直接設定最小接收字元有1byte就會有事件觸發,你的方法也有試過,收到的速度是一樣的。

    另外,Baud Rate如果沒有設對,那麼應該是不會通才對...(兩邊有確認是一樣的)

    2011年10月27日 上午 01:56
  • 改用vb.net 2008 用serialport也是一樣耶

    送出

            Dim CMD() As Byte = {16, 2, 1, 0, 15, 0, 0, 0, 162, 2, 7, 137, 0, 0, 16, 3, 111, 32}

            SerialPort1.Write(CMD, 0, UBound(CMD) + 1)

    接收並show在listbox
        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Dim n As Integer = SerialPort1.BytesToRead
            Dim comBuffer As Byte() = New Byte(n - 1) {}
            SerialPort1.Read(comBuffer, 0, n)
            Dim i As Integer
            For i = 0 To UBound(comBuffer)
                listbox1.items.add(comBuffer(i).ToString)
            Next
        End Sub

    2011年10月27日 上午 07:03
  • 那其他的設定呢?
    如InBuffersize, Inputlen, ParityReplace, HandShaking等屬性呢?

    該設備應該有對應的設定值吧!

    Rs232接設備的距離呢?


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年10月27日 上午 10:39
  • 先把 ListBox 註解掉

    另外用 AccessPort 監看你接收的狀況。

    我自己在 VB6 / VBNET 寫通訊埠都正常。

    基本時間大概是 100 ms 以內 (假定設備處理速度需 50ms)

     

    comBuffer 應該是要宣告為 Buffer 大小。n 是這樣取得:

    n = SerialPort1.Read(comBuffer, 0, bufferLength)

     

    大量塞資料到可視化物件時,應先停用畫面更新,塞完後再更新。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月27日 下午 02:48
  •  Inputlen=1

    其餘為default

    2011年10月28日 上午 02:36
  • 我使用Timer方式時,InputLen是設為0!

    那設備相關設定呢? 不然就要問一下設備商,他們的設定值是什麼,Check一下!

    或是有範例程式!

     

    About Hardware


    - ParityReplace
    mean is character value instead of occur Parity Error
    - NullDiscard mean is define in receive or not "NULL CHARACTER"
    - RTSEnablemean is define signal RTS (Request To Send)
    - DTSEnablemean is define signal DTR(Data Terminal Ready)

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2011年10月28日 上午 02:47
    2011年10月28日 上午 02:47
  • VBNET 我的經驗算好時間可以一次收。

    VB6 我的經驗至少要分三次以上收才會比較穩定,比如說回傳 100 bytes 時,我會分成 34, 34, 32 bytes 收。兩兩之間都會用 sleep API 來放出 CPU 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月28日 下午 03:19
  •        嗯嗯嗯 小弟認同心大的作法...

           之前小弟寫一個 modbus 設備時, 他好奇怪 要先送一碼的 站號 在送後面的命令

           用他們的程式都沒問題   但自己寫就會遇到問題哩.... good luck

     

     

    2011年10月29日 上午 08:51
  • 感謝各位的回覆。

    目前遇到的問題是改了baud rate 應該可以改善通訊速度,為什麼9600、19200、38400都是同樣的接收速度,

    照理說9600bps來收一個22byte應該是9600/8/=1200Bps 在20ms就可以收回來了才是。

    2011年10月31日 上午 01:29
  • 發送要時間,設備回應命令要時間,接收要時間。

    設 9600 也不見得全速再跑。

    程式沒寫好,1 byte 1 byte 從緩衝區讀出來,也比一次讀出來時間要久。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月31日 下午 12:31
  • 這個問題我也想過了,所以我也有試過一次收22byte,但還是一樣?
    2011年11月1日 上午 12:45
  • 因為這個設備的附的dll去通訊就沒有這個問題,cmd也是從中截取出來的,它可以回覆正確的訊息回來帶cmd沒錯,baud rate沒錯

    但就是不知是那裏有錯,有經驗的大大可以指點一下嗎?

    2011年11月1日 上午 09:10
  • 你可以從這篇找到 AccessPort 下載連結,用該軟體來監看你的通訊過程:

    [推薦]通訊必備監聽軟體 AccessPort


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月1日 下午 03:57
  • to 心冷熱情熄  大大:可否簡介如何使用AccessPort,抓不到資料

    我想監看com port5的通訊,該如何設定,謝謝~

    2011年11月2日 上午 03:36
  • 執行該程式,然後在工具 Menu的配置參數功能,裡面可以設定連接 Port等參數哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年11月2日 上午 04:51
  • 可是設完這個後我的程式就不能再重覆開啟該com port

     

    2011年11月2日 上午 05:08
  • 要在Access Port設成監聽, 啟動監聽後再開啟你的程式.
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年11月2日 上午 05:15
    版主
  • 這樣還com port還是沒法開啟,可以再詳解一下嗎?
    2011年11月2日 上午 05:38
  • 你右半張圖是對的,左半圖是多的。

    左半是給 Terminal 用的,也就是當你連程式都沒寫時,用 Terminal 加左半圖測試。

    所以你程式開始執行之前,先由右半圖選好通訊埠、按下 Play 按鈕後,開始執行你的程式即可,執行過程中隨時可以切過來看,也可以執行完切過來看。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月2日 下午 01:59
  • 還是收不到攔不到資料耶....

    綠色數字是我收回來的資料,但accessport沒有什麼反應耶....

     

    2011年11月3日 上午 01:01
  • accessport可以攔截了,也確定是設備在回傳給我的資料確實比較慢,佷奇怪,同一台電腦同一個com,不一樣軟體會有這樣的差別,應該是那一個設定的問題吧~

    com接收以timer 50ms去收全部,沒有再做其它動作了,所以不知那裏出了問題...

    2011年11月3日 上午 05:26
  • 以下是截取內容,它的time是什麼單位,代表什麼?

     

    #       Time        Function                        Data ( Hex )

     

    1       [00000000]  IRP_MJ_CREATE                   Port Opened - vb6.exe

    2       [00000004]  IOCTL_SERIAL_SET_BAUD_RATE      Baud Rate: 9600

    3       [00000004]  IOCTL_SERIAL_SET_LINE_CONTROL   StopBits: 1, Parity: No, DataBits: 8

    4       [00000084]  IRP_MJ_WRITE                    Length: 0018, Data: 10 02 01 00 0F 00 01 00 A2 02 07 89 00 00 10 03 62 B0 

    5       [00000089]  IRP_MJ_READ                     Length: 0013, Data: 10 06 10 02 01 4F 01 58 03 10 03 83 EA 

    6       [00000153]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    7       [00000217]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    8       [00000281]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    9       [00000778]  IRP_MJ_WRITE                    Length: 0018, Data: 10 02 01 00 0F 00 02 00 A2 02 07 89 00 00 10 03 76 40 

    10      [00000781]  IRP_MJ_READ                     Length: 0013, Data: 10 06 10 02 01 4F 02 9D 06 10 03 D4 87 

    11      [00000845]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    12      [00000909]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    13      [00000973]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    14      [00001802]  IRP_MJ_WRITE                    Length: 0018, Data: 10 02 01 00 0F 00 03 00 A2 02 07 89 00 00 10 03 7B D0 

    15      [00001807]  IRP_MJ_READ                     Length: 0013, Data: 10 06 10 02 01 4F 03 06 1E 10 03 92 A8 

    16      [00001813]  IRP_MJ_WRITE                    Length: 0018, Data: 10 02 01 00 0F 00 04 00 A2 02 07 89 00 00 10 03 5D E0 

    17      [00001815]  IRP_MJ_READ                     Length: 0002, Data: 10 06 

    18      [00001871]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    19      [00001935]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    20      [00001999]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    21      [00002063]  IRP_MJ_READ                     Length: 0011, Data: 10 02 01 4F 04 B8 1E 10 03 47 4C 

    22      [00002127]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    23      [00002191]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    24      [00002255]  IRP_MJ_READ                     Length: 0002, Data: 10 05 

    2011年11月3日 上午 06:05
  • 把你 Read 期間,迴圈裡面在幹嘛貼出來。你 Write 完馬上就收,所以看得出來是你 Read 部分寫得有問題。

    至於時間長度,你拿碼表量一下就知道了。我電腦約 1 = 15ms


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年11月3日 下午 12:49