none
VB2008 如何建立一個RS232的DLL模組 RRS feed

  • 問題

  • 請教各位大大小弟 近來嚐試建立一個RS232的DLL檔!

    測試如下:

    1.輸入的值=10000時 會跳出 超出範圍的訊息 Label6.text="0000"--OK

    2.可發送資料但接收卻無動作!所以會跳出  "讀取失敗"訊息! Label6.text=""

    能否告知小弟有哪些步驟是小弟沒注意到的

    DLL程式碼如下:

    Public Class Class1 Private ComPort As SerialPort Private Function CreateComport(ByVal port As SerialPort) As SerialPort If port Is Nothing Then port = New SerialPort("COM8", 9600, Parity.Odd, 7, StopBits.One) End If Return port End Function Private Function SUM(ByVal SXD As String) As String Dim A As Integer = 0 Dim buffer2 As String For i As Integer = 1 To SXD.Length Dim Buffer As Integer = Asc(Mid(SXD, i, 1)) A = A + Buffer Next buffer2 = Hex(A) SUM = buffer2.Substring(buffer2.Length - 2, 2) End Function Public Function Read_Word(ByVal Device As String, ByVal Device_Start As String) As String Dim Work_Device As String Dim Conver_Device_Start As String Dim SXD As String Dim Send_SXD As String Dim RD As String If Device_Start > 9999 Then

    MsgBox("超出可設定範圍!可命令DM區不可超出DM9999") Read_Word = "0000" Else Conver_Device_Start = "0000" & Device_Start Work_Device = Device & Conver_Device_Start.Substring(Conver_Device_Start.Length - 4, 4) SXD = "00" + "FF" + "WW" + "A" + Work_Device + "01" Send_SXD = Chr(5) + SXD + SUM(SXD) + Chr(13) ComPort = CreateComport(ComPort) ComPort.Open() ComPort.WriteLine(Send_SXD) System.Threading.Thread.Sleep(100) If ComPort.BytesToRead > 0 Then RD = ComPort.ReadLine() Read_Word = System.Convert.ToInt32(Mid(RD, 5, 4), 16) ComPort.close() Else MsgBox("讀取失敗", MsgBoxStyle.SystemModal, "DM") ComPort.close() End If End If End Function

    另開一個程式

    Imports System.IO
    Imports System.IO.Ports
    Imports System.Threading
    Imports Microsoft.VisualBasic
    Imports System.Windows.Forms
    Imports RS232
    
    Public Class Form1
        Dim RS232 As New Class1
      Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Label6.Text = RS232.Read_Word(TextBox1.Text, TextBox2.Text)
        End Sub
    end Class


    新手上路


    • 已編輯 eblue 2012年2月15日 上午 07:27
    2012年2月15日 上午 07:25

解答

  • 會不會是你在Write 後 Sleep 的時間太短了 ?


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

    • 已標示為解答 eblue 2012年2月15日 上午 09:17
    2012年2月15日 上午 08:22
    版主

所有回覆

  • 會不會是你在Write 後 Sleep 的時間太短了 ?


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

    • 已標示為解答 eblue 2012年2月15日 上午 09:17
    2012年2月15日 上午 08:22
    版主
  • 反覆的測:

    1.雖然傳輸線不到30cm雖然只讀1各D值但 回應時間要放大到200ms !才算穩

    2.指令下錯

    以上2個原因造成數據讀取異常!

     


    新手上路

    2012年2月15日 上午 09:17
  • 因為, 你傳指令給Device, 它還是得花點時間處理才能有值傳給你啊.

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

    2012年2月15日 上午 09:28
    版主
  • SerialPort 通訊要考慮幾個時間:

    1. 通訊間隔。指每次 Write 到 Read 完成後,下次 Write 間的時間。設備可能會利用這個時間長短來判斷是否為不同次的命令。

    2. 傳輸時間。雖然你用 9600 bps ,但是實際上絕對不會是 9600 ,就像你網路線 100MBps ,但是大部分時間速度都沒到這個值。這個時間一來、一回。

    3. 設備反應時間。設備收到你的命令到回應你的命令前,所需要時間處理,雖然說是看微處理器的晶片等級,但大部分都是韌體寫得好不好。

    4. Timeout 時間。傳輸還有可能逾時,所以這也是重要時間點。

    一般沒有特別問題的設備,我會使用:

    1. 10ms ,我碰過很多設備要求 100ms ~ 500ms 。

    2. 傳輸時間 x 2 倍。

    3. 30ms ,比較爛的設備會拉到 100ms 。

    4. >500ms。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年2月15日 下午 03:03