none
如何讓程式能接收255以上的數值? RRS feed

  • 問題

  • 如題~

    想請教各位前輩

    最近在作用RS232接收數值

    目前只能接受顯示0~255 

    如果要能顯示255以上的話我下面的程式要如何修改?

    懇請各位前輩指教

    ------------------------------------------------------------------------------------------------------------

    Imports System.IO.Ports


    Public Class Form1
        '宣告一個通訊埠物件
        Dim RS232 As SerialPort

        '**************************************************************
        '表單的Load事件中先將所有的通訊埠先列出來
        '將通訊埠排序,並將第一個通訊埠設為預設值
        '**************************************************************
        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

        '**************************************************************
        '『開啟通訊埠』按鈕的Click事件
        '此事件將設定通訊埠參數,並開啟通訊埠
        '**************************************************************
        Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
            Dim mBaudRate As Integer
            Dim mParity As IO.Ports.Parity
            Dim mDataBit As Integer
            Dim mStopbit As IO.Ports.StopBits
            Dim mPortName As String

            mPortName = cmbCOM.SelectedItem.ToString   '欲開啟的通訊埠   
            mBaudRate = 9600   '通訊速度
            mParity = Parity.None  '同位位元檢查設定
            mDataBit = 8    '資料位元設定值
            mStopbit = StopBits.One  '停止位元設定值
            '建立一個通訊埠物件
            RS232 = New IO.Ports.SerialPort(mPortName, mBaudRate, mParity, mDataBit, mStopbit)
            If Not RS232.IsOpen Then  '尚未開啟
                RS232.Open()  '開啟通訊埠
                btnSend.Enabled = True  '致能傳送按鈕
                Timer1.Interval = 100
                Timer1.Enabled = True
            Else
                MsgBox("~~通訊埠開啟錯誤(通訊埠已被開啟)~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
                End
            End If

        End Sub

        '**************************************************************
        '『關閉通訊埠』按鈕的Click事件
        '以Close方法關閉通訊埠,並釋放物件所佔用的資源
        '**************************************************************
        Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
            If RS232 Is Nothing OrElse Not RS232.IsOpen Then  '尚未開啟
                MsgBox("~~通訊埠尚未開啟~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
            Else
                btnSend.Enabled = False
                Timer1.Enabled = False
                RS232.Close()
            End If

        End Sub

        '**************************************************************
        '『結束程式』按鈕 的Click事件
        '此事件將設定通訊埠參數,並開啟通訊埠
        '**************************************************************
        Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
            If Not RS232 Is Nothing Then  '判斷是否已建立通訊物件
                If RS232.IsOpen Then RS232.Close() '若已開啟,就將其關閉
            End If
            End
        End Sub

        '**************************************************************
        '計時器控制項的Timer事件
        '將接收的動作放於其中,只要有資料就會被接收進來
        '**************************************************************
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim InByte() As Byte, ReadCount As Integer

            If RS232.BytesToRead <= 0 Then Exit Sub
            ReDim InByte(RS232.BytesToRead - 1)
            ReadCount = RS232.Read(InByte, 0, RS232.BytesToRead)
            If ReadCount = 0 Then  '若無資料則跳出
                Exit Sub
            Else
                For Each bData As Byte In InByte
                    txtReceive.Text += bData.ToString & vbCrLf  '若有資料則加到接收的文字框
                Next
            End If

        End Sub

        '**************************************************************
        '『傳送』按鈕的Click事件
        '將文字框中的位元組數值以Write方法自串列埠送出
        '**************************************************************
        Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
            Dim bDataOut(0) As Char
            Try
                bDataOut(0) = CType(txtSend.Text, Char) '將型態轉換為位元組
                RS232.Write(bDataOut, 0, 1)
            Catch ex As Exception
                MessageBox.Show("輸入數值錯誤:" + ex.ToString, "錯誤通知", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End Try
        End Sub

        '**************************************************************
        '通訊埠的KeyPress事件,在此不讓使用者輸入資料
        '**************************************************************
        Private Sub cmbCOM_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbCOM.KeyPress
            e.KeyChar = ChrW(0)  '禁止使用者在其中輸入任何的文字
        End Sub

        Private Sub txtReceive_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtReceive.TextChanged

        End Sub

        Private Sub cmbCOM_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbCOM.SelectedIndexChanged

        End Sub
    End Class

    2015年5月19日 上午 03:51

解答

  • 如何:在 Visual Basic 中將字串轉換為位元組陣列

    https://msdn.microsoft.com/zh-tw/library/ms172828.aspx

    因為只有Write一個Char,要把字串轉換為位元組陣列再Write...

    2015年5月19日 上午 04:13
  • short 就兩個 bytes 表示, int 就四個bytes 表示.

    如何:將位元組陣列轉換成整數 (C# 程式設計手冊)


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

    2015年5月19日 上午 06:31
    版主
  •     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim InByte() As Byte, ReadCount As Integer

            If RS232.BytesToRead <= 0 Then Exit Sub
            ReDim InByte(RS232.BytesToRead - 1)
            ReadCount = RS232.Read(InByte, 0, RS232.BytesToRead)
            If ReadCount = 0 Then  '若無資料則跳出
                Exit Sub
            Else
                For Each bData As Byte In InByte
                    txtReceive.Text += bData.ToString & vbCrLf  '若有資料則加到接收的文字框
                Next
            End If

        End Sub


    1.  一般來說,InByte 會宣告成 rs232 的讀取緩衝區大小。

    2. 宣告 InByte 時的 BytesToRead 到 Read 之間,仍然可能接收到資料,就會產生溢位。

    3. 一般我會建議先寫入 MemoryStream ,因為會重複觸發讀取,再確認字串編碼後,用 Encoding.GetString(Byte[]) 來取得你要顯示的字串。


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

    2015年5月22日 下午 01:08

所有回覆

  • 如何:在 Visual Basic 中將字串轉換為位元組陣列

    https://msdn.microsoft.com/zh-tw/library/ms172828.aspx

    因為只有Write一個Char,要把字串轉換為位元組陣列再Write...

    2015年5月19日 上午 04:13
  • short 就兩個 bytes 表示, int 就四個bytes 表示.

    如何:將位元組陣列轉換成整數 (C# 程式設計手冊)


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

    2015年5月19日 上午 06:31
    版主
  •     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim InByte() As Byte, ReadCount As Integer

            If RS232.BytesToRead <= 0 Then Exit Sub
            ReDim InByte(RS232.BytesToRead - 1)
            ReadCount = RS232.Read(InByte, 0, RS232.BytesToRead)
            If ReadCount = 0 Then  '若無資料則跳出
                Exit Sub
            Else
                For Each bData As Byte In InByte
                    txtReceive.Text += bData.ToString & vbCrLf  '若有資料則加到接收的文字框
                Next
            End If

        End Sub


    1.  一般來說,InByte 會宣告成 rs232 的讀取緩衝區大小。

    2. 宣告 InByte 時的 BytesToRead 到 Read 之間,仍然可能接收到資料,就會產生溢位。

    3. 一般我會建議先寫入 MemoryStream ,因為會重複觸發讀取,再確認字串編碼後,用 Encoding.GetString(Byte[]) 來取得你要顯示的字串。


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

    2015年5月22日 下午 01:08