none
我想問關於function的問題 RRS feed

  • 問題

  • 我想請問一下各位前輩

    就是我現在用serialPort來抓資料 
    當 serialPort  在form1裡面可以執行
     如果在form1裡面建一個function,再把serialPort  寫在裡面也可以
     可是如果funtion是另外建在模組裡面而不是建立在form1
     那我的serialPort  就會顯示未宣告而不能編譯

    我之前也碰過這些問題,我想請問該怎麼解決,謝謝各位前輩

    2011年7月6日 上午 09:21

解答

  • 因為你在模組內並沒有宣告:RS232

    你可以在模組宣告區輸入:

    Private RS232 As New System.IO.Ports.SerialPort


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

    假設你先宣告一個變數 x 其型別為 Serialport

    Dim x as Serialport (這邊沒有New喔, 此時x 會指向一個Null, 也就是VB的Nothing)

    x=New SerialPort() <--這邊使用 New SerialPort, 表示它會用SerialPort類別的無參數建構函式產生一個實體(或稱執行個體, Instance), 這時候的x會指向這個實體.

    然後我又很不合理的再來一次

    x=New SerialPort() <---一樣會產生一個新的實體, 而此時x就會指向這個實體, 而和上面那個實體無關了.

    你可以試寫個程式驗證

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim rs232 As System.IO.Ports.SerialPort
            rs232 = New System.IO.Ports.SerialPort
            rs232.PortName = "COM8"
            rs232 = New System.IO.Ports.SerialPort
            MessageBox.Show(rs232.PortName)
        End Sub

    你會看到在Messagebox中顯示的是COM1而不是COM8

    (2) 依據(1)的解釋, 你在 模組中如果宣告 Private RS232 As New System.IO.Ports.SerialPort 這個實體和你拉到畫面的實體是兩的不同的東西, 也就是說, 如果你採心冷大建議的做法, 你畫面上根本不用再拉一個SerialPort出來, 因為你在模組中用的SerialPort實體和Form上的根本無關

    (3) 關於Combobox的問題, 你可以這樣處理:

    <模組>

    Module Module1
        Public com As String
        Private RS232 As New System.IO.Ports.SerialPort
        Public Sub test()
            RS232.PortName = com
            MessageBox.Show(RS232.PortName)
        End Sub
    End Module

    <Form>

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Module1.com = ComboBox1.SelectedItem.ToString()
            Module1.test()
        End Sub
    End Class

    也就是說, 你可以在模組中宣告一個公用變數來存取Combobox的選項文字

     


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

    2011年7月11日 下午 02:24
    版主
  • Private RS232 As New System.IO.Ports.SerialPort

    改成

    Public RS232 As New System.IO.Ports.SerialPort

     

    然後把 Form 上面同名的 RS232 物件刪除即可。


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

所有回覆

  • 把程式碼貼上來看看

    你要在模組中使用SerialPort, 要不就是把 serialport的執行個體傳給該模組的Function, 要不是就在該Function中建立Serialport執行個體.


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

    2011年7月6日 上午 09:49
    版主
  • 小弟我的程式如下

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
    
    
      OrderCommand = Read("KG", 1, "8")
    
    
    
    Public Function Read(ByVal Address As String, ByVal ByteNumber As Integer, ByVal ReadNumber As String) As String
    
      Dim i, a, intTmp As Integer
    
      Dim strTmp As String
    
      Dim AddressTmp = Address
    
      
    
    
    
       ............... 中間程式碼太多了省略,接著如下
    
    
    
       RS232.Open()
    
       RS232.DiscardInBuffer()
    
       RS232.Write(Read)
    
       System.Threading.Thread.Sleep(500) 
    
       strTmp = RS232.ReadExisting
    
       strTmp = Mid$(strTmp, 2, 2)
    
       strTmp = Hex2Bin(strTmp)
    
       Label1.Text = Mid(strTmp, 9 - ReadNumberTmp, ReadNumberTmp)
    
    
    
       RS232.Close().................
    
    
    
    

     

    如上面所示,我這樣可以正常RUN

    但是我想把這個function丟到模組裡面去就會顯示RS232未宣告

    請教前輩我應該怎麼解決??


    2011年7月6日 上午 11:30
  • 因為你在模組內並沒有宣告:RS232

    你可以在模組宣告區輸入:

    Private RS232 As New System.IO.Ports.SerialPort


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年7月6日 下午 03:45
  • (1) 我猜你的RS232這個SerialPort執行個體是從工具箱拉到畫面上產生的吧 ?

    (2) 我假設你把 Public Function Read(ByVal Address As String, ByVal ByteNumber As Integer, ByVal ReadNumber As String) As String 這個function 放進模組

    所以(2-1) 把serialport也加入參數

    將function 改成 Public Function Read(ByVal Address As String, ByVal ByteNumber As Integer, ByVal ReadNumber As String,ByVal RS232 as Serialport) As String

    (2-1) 因此你在Form要呼叫這個function就變成

    Read(參數1, 參數2, 參數3, RS232) <--這樣也行

     


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

    2011年7月7日 下午 06:28
    版主
  • 回覆BIll 前輩,我希望我的格式不要多加一個參數進去,希望能在function裡面就好,大概就像再上面那位前輩的說法,  可是我現在希望能在畫面用comboBOX讓使用者選擇COMPORT

    我在書上有找到列車ComboBox列出所有的COM去選擇,以下是我找到的程式 


     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        For Each sp As String In SerialPort.GetPortNames
          cmbCOM.Items.Add(sp)
        Next
        cmbCOM.Sorted = True '排序
        cmbCOM.SelectedIndex = 0 '第一個是預設選項
      End Sub
    
    
    
    
     Private Sub btnPortOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPortOpen.Click
        RS232.PortName = cmbCOM.SelectedItem.ToString  '欲開啟的通訊埠  
        RS232.BaudRate = 9600  '通訊速度
        RS232.Parity = Parity.Even '同位位元檢查設定
        RS232.DataBits = 7  '資料位元設定值
        RS232.StopBits = StopBits.One '停止位元設定值  
        RS232.Encoding = Encoding.Unicode '設定編碼方式為Unicode,以便能顯示中文
        RS232.Handshake = Handshake.RequestToSend
    
        If Not RS232.IsOpen Then '尚未開啟
          RS232.Open() '開啟通訊埠
          'btnSend.Enabled = True '致能傳送按鈕
          'btnReceive.Enabled = True
        Else
          MsgBox("~~通訊埠開啟錯誤(通訊埠已被開啟)~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
          End
        End If
      End Sub

    我現在是把我的動作都寫在模組(或者元件)

    然後我按按鈕它就會自己去搜尋模組動作,那我的問題又來了

    我要怎麼做才能把ComboBox所選的ComPort丟到模組裡面??

    像心冷熱情熄前輩說的Private RS232 As New System.IO.Ports.SerialPort之後需要再重新定義所有的RS232的屬性嗎??

    如果我不適用在"模組"是用在"元件"這個檔案裡面寫法會不一樣嗎??

    2011年7月11日 上午 08:50
  • (1) 我先簡單介紹 New 在幹嘛好了.

    假設你先宣告一個變數 x 其型別為 Serialport

    Dim x as Serialport (這邊沒有New喔, 此時x 會指向一個Null, 也就是VB的Nothing)

    x=New SerialPort() <--這邊使用 New SerialPort, 表示它會用SerialPort類別的無參數建構函式產生一個實體(或稱執行個體, Instance), 這時候的x會指向這個實體.

    然後我又很不合理的再來一次

    x=New SerialPort() <---一樣會產生一個新的實體, 而此時x就會指向這個實體, 而和上面那個實體無關了.

    你可以試寫個程式驗證

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim rs232 As System.IO.Ports.SerialPort
            rs232 = New System.IO.Ports.SerialPort
            rs232.PortName = "COM8"
            rs232 = New System.IO.Ports.SerialPort
            MessageBox.Show(rs232.PortName)
        End Sub

    你會看到在Messagebox中顯示的是COM1而不是COM8

    (2) 依據(1)的解釋, 你在 模組中如果宣告 Private RS232 As New System.IO.Ports.SerialPort 這個實體和你拉到畫面的實體是兩的不同的東西, 也就是說, 如果你採心冷大建議的做法, 你畫面上根本不用再拉一個SerialPort出來, 因為你在模組中用的SerialPort實體和Form上的根本無關

    (3) 關於Combobox的問題, 你可以這樣處理:

    <模組>

    Module Module1
        Public com As String
        Private RS232 As New System.IO.Ports.SerialPort
        Public Sub test()
            RS232.PortName = com
            MessageBox.Show(RS232.PortName)
        End Sub
    End Module

    <Form>

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Module1.com = ComboBox1.SelectedItem.ToString()
            Module1.test()
        End Sub
    End Class

    也就是說, 你可以在模組中宣告一個公用變數來存取Combobox的選項文字

     


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

    2011年7月11日 下午 02:24
    版主
  • Private RS232 As New System.IO.Ports.SerialPort

    改成

    Public RS232 As New System.IO.Ports.SerialPort

     

    然後把 Form 上面同名的 RS232 物件刪除即可。


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

    2011年7月12日 上午 07:31
  • 麻煩請讓我們確實知道你是怎麼解決的,  好嗎 ?
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年7月12日 下午 02:37
    版主
  • 回復BILL前輩,小弟依照您的方法去做就解決了,不過我是把它放在"元件"裡面^^

    謝謝BILL與其他前輩的指噵

    2011年7月13日 上午 06:45
  • "元件"? 還是你指的是 "自訂類別" ?
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年7月13日 上午 06:47
    版主
  • 前輩很抱歉喔,我不太會說明,因為小弟對VB的定義不是很熟,應該就是像前輩說的自訂類別吧

    可以讓我直接再form裡面打read.然後後面就會跑出很多用法的那個

    比方說read.froce(x,x,x)類似這樣子

    真的很謝謝前輩

     

    2011年7月14日 上午 02:04