none
RS232接收資料 和 傳送 RRS feed

  • 問題

  • 請問一下我按下button1 就是開啟COM1,那我有設一個Button6 是蟲我的textbox2傳出去然後,從textbox1接收,
    我的RS232  2.3腳短路,可是並沒有顯示在我的textbox1 ,想請問是我沒有傳送出去還是沒有接收到,各位大哥可以幫我看一下ㄇ?
    我是在書上看到兩個寫法
     SerialPort1.Write()      ==========這個是寫char的
     SerialPort1.WriteLine()==========這個是寫String的
    是這樣子嗎?


    Imports System.IO.Ports


    Public Class Form1
        Dim Rs232ConnectionState As Integer
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim ports() As String = SerialPort.GetPortNames()
            Dim msgg As String
            Dim ComPortCounter As Integer
            For Each port As String In ports
                'msgg = port & vbCrLf
                msgg = port
                ComboBox1.Items.Insert(ComPortCounter, msgg)
                ComPortCounter = ComPortCounter + 1
            Next
            PictureBox1.ImageLocation = "r.jpg"
            Button1.Text = "連線"
            Rs232ConnectionState = 0
            Button6.Enabled = False
            Me.Button1.BackColor = System.Drawing.Color.FromArgb(80, 100, 10, 20)
        End Sub

        Private Sub ComboBox1_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.DropDown
         
        End Sub

        Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
         
          
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

           

            If Rs232ConnectionState = 0 Then
                '==========================
                SerialPort1.PortName = ComboBox1.Text
                Try
                    SerialPort1.Open()
                Catch ex As Exception
                    MsgBox("連接埠使用中")
                    Exit Sub
                End Try


                ' MsgBox("開啟成功")
                '==========================
                Button1.Text = "停止連線"
                Rs232ConnectionState = 1
                ComboBox1.Enabled = False
                ComboBox2.Enabled = False
                PictureBox1.ImageLocation = "g.jpg"
                Button6.Enabled = True
            Else
                '=====================
                SerialPort1.Close()
                '=====================
                Button1.Text = "連線"
                Rs232ConnectionState = 0
                ComboBox1.Enabled = True
                ComboBox2.Enabled = True
                PictureBox1.ImageLocation = "r.jpg"
                Button6.Enabled = False

     

            End If

        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            End
        End Sub

     

        Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged

            SerialPort1.BaudRate = ComboBox2.SelectedItem
        End Sub

     
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            TextBox1.Text = ""
        End Sub


        Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            TextBox1.Text = TextBox1.Text + SerialPort1.ReadLine()
        End Sub

     

      

        Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
            SerialPort1.WriteLine(TextBox2.Text)
        End Sub

        Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click

        End Sub
    End Class

    2009年5月25日 上午 04:39

解答

所有回覆

  • 您好,您的問題有提到 [請問是我沒有傳送出去還是沒有接收到]
    通常這種情形我會建議先使用 Windows 內建的 超級終端機 來測試RS232是否有傳送與接收
    您可以參考這個網址,把問題釐清,是硬體的問題,還是您程式的問題
    http://www.leaptronix.com/PDF/mPP_remote_terminal.pdf

    2009年5月25日 上午 04:45
    版主
  • 嘿嘿:
        在SerialPort類別中, ReadLine代表讀取輸入緩衝區NewLine 值之前的內容 ,也就是說他要讀到一個換行符號為止,
        WriteLine則代表寫入時會自動帶一個NewLine在結尾.
        至於Write有三個多載
        SerialPort.Write (String) 
        SerialPort.Write (Byte[], Int32, Int32) 
        SerialPort.Write (Char[], Int32, Int32) 
       
         Read則有兩個多載
         SerialPort.Read (Byte[], Int32, Int32) 
         SerialPort.Read (Char[], Int32, Int32) 
       
    2009年5月25日 上午 05:01
    版主
  • To 嘿嘿

    1. 您要不要試著在 SerialPort1_DataReceived 事件中加入 中斷點,觀察是否有觸發DataReceived事件


    2. 另外,可以嘗試將
     
    TextBox1.Text = TextBox1.Text + SerialPort1.ReadLine()

    改用

    TextBox1.Text = TextBox1.Text + SerialPort1.ReadExisting

    2009年5月25日 上午 05:12
    版主
  • 我是在電腦上做RS232終端機是可以第二角和第三角短路,這樣硬體是沒問題的,然後程式也有跳到SerialPort1_DataReceived
    2009年5月25日 上午 05:23
  •   SerialPort1.ReadByte 因為這項評估可能會有副作用,所以要等使用者啟用它時才會執行。 
     
      跨執行緒作業無效: 存取控制項 'TextBox1' 時所使用的執行緒與建立控制項的執行緒不同。
    2009年5月25日 上午 05:31
  •   SerialPort1.ReadByte 因為這項評估可能會有副作用,所以要等使用者啟用它時才會執行。 
     
      跨執行緒作業無效: 存取控制項 'TextBox1' 時所使用的執行緒與建立控制項的執行緒不同。

    拍謝,還沒說完,他是顯示這個錯誤,是不是不能把它
    TextBox1.Text = TextBox1.Text + SerialPort1.ReadLine() 放在 接收裡面
    2009年5月25日 上午 05:35
  • Visual Basic 2005與自動化系統監控-RS232串列通訊篇
    http://www.kingsinfo.com.tw/item_detail.asp?pro_id=6487


    http://220.130.0.150/pp/kingsinfo/p/P6207.zip

    參考投影片第66頁,執行緒及委派概念...
    2009年5月25日 上午 05:43
  • 也許您可以使用 Delegate 的方式
    http://social.msdn.microsoft.com/Forums/zh-TW/803/thread/162ae0e7-d45a-459d-97a0-74b91fb2adb6

    2. 另外,參考 MSDN 中,SerialPort.DataReceived 事件的備註,使用Invoke
    http://msdn.microsoft.com/zh-tw/library/system.io.ports.serialport.datareceived.aspx

    SerialPort 物件收到資料時,會在次要執行緒上引發 DataReceived 事件。由於這個事件是在次要執行緒上引發,而非主執行緒,所以嘗試在主執行緒中修改某些項目 (例如 UI 項目) 可能會引發執行緒例外狀況。如果必須在主要 FormControl 中修改項目,請使用 Invoke 回傳變更要求,此方法將會針對適當的執行緒執行此作業。

    3. 參考以下網址,有 跨執行緒作業無效: 存取控制項 'TextBox1' 時所使用的執行緒與建立控制項的執行緒不同。問題的解決方式
    http://social.msdn.microsoft.com/forums/zh-TW/233/thread/47d4b39e-7af0-4875-a69b-e36e0a932b87/

    2009年5月25日 上午 05:43
    版主
  • 嘿嘿: 
       DataReceived 事件是非同步的,必須使用Invoke才能呼叫主畫面的控制項
       以下的link有類似的程式可以讓你參考
       http://www.dotblogs.com.tw/billchung/archive/2009/04/12/7981.aspx
    2009年5月25日 上午 05:47
    版主
  • 各位大哥,我突然想到是不是VB在DEBug 下因為執行緒的關係,所以照成錯誤,小弟這時候就想到以前做VB6好像也有聽人家說過這個問題,所以就直接跑去debug\bin下執行我生出來的執行檔,結果..ㄏㄏㄏ其實已經顯示出來了!那這樣還會有問題ㄇ?

    2009年5月25日 上午 05:51
  • MSDN文件是這樣寫的

    Windows Form 控制項的存取並非原本就採用安全執行緒的方式。如果您有兩個或多個執行緒管理控制項的狀態,就有可能強制控制項進入不一致的狀態。其他與執行緒有關的錯誤也有可能如此,包括競爭情形和死結。確定存取控制項是以安全執行緒的方式來進行,是很重要的。
    .NET Framework 有助於偵測當您使用非安全執行緒的方式存取控制項的情況。當您在偵錯工具中執行應用程式,且有建立控制項之執行緒以外的執行緒嘗試呼叫該控制項時,偵錯工具會引發 InvalidOperationException 和訊息:「存取控制項 control name 時所使用的執行緒與建立控制項的執行緒不同」。
    在偵錯期間這個例外狀況會經常發生,且在某些情況下會發生於執行階段強烈建議您在發現問題時就加以修正。您可能會在針對使用 .NET Framework 2.0 版之前版本的 .NET Framework 所撰寫的應用程式進行偵錯時,發現這個例外狀況。

    ========================================================================
    結論是:該用Invoke還是用Invoke的好.

    2009年5月25日 上午 06:05
    版主
  • 各位大哥還在嗎?小弟還有一件事請教一下!就是textbox的字數是有限的,請問各位大哥是怎麼處理,我是想說清掉重來,可是這樣前面的資料就不見了,想請教有什麼另類的方法的

    2009年5月25日 上午 06:06
  • 可以用 ListBox, DataGridView 等等清單式的控制項

    2009年5月25日 上午 06:11
    版主
  • To 嘿嘿
    我的作法會固定一段時間,將資料存到記事本中,再將 TextBox 清除,這樣應該就可以了
    或者更好的方式是將接收到的資料整理好,儲存到資料庫中,以供後續分析與處理

    2009年5月25日 上午 06:11
    版主
  •  
        me.TextBox1.Multiline =True 

    您存了多少字?有設上列屬性嗎?還是要把前面的資料存檔呢...
    2009年5月25日 上午 06:12
  • 謝謝各位大哥,那小弟先去研究一下Invoke感謝各位大哥,捨時間給小弟指導
    2009年5月25日 上午 06:15
  • Bill Chung大哥,我有去看Invoke的用法了,程式也可以正常,謝謝!

    2009年5月25日 上午 06:31
  • 可以用 ListBox, DataGridView 等等清單式的控制項


    http://social.msdn.microsoft.com/forums/zh-TW/232/thread/77f4644f-2b0f-4a8e-8d79-bfdc5657ef7c/
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月25日 下午 03:03