none
請問16進制的數值,怎麼放進byte 陣列裡 RRS feed

  • 問題

  • 小弟是VB.net新手,最近手上剛好有台三菱Q系列PLC,所以想做簡易介面通訊測試。

     If tcp.Connected = True Then
                Dim send() As Byte = Encoding.ASCII.GetBytes("500000FF03FF000018001004010000D*0000000001")

    '內容為 三菱MC協定"
                For i = 0 To (send.Length - 1)

                    send(i) = Hex(send(i))

                Next


                tcp.GetStream.Write(send, 0, send.Length)
                System.Threading.Thread.Sleep(1000)

            End If

            If tcp.Connected = True Then
                If tcp.GetStream.CanRead = True Then
                    Dim read(tcp.ReceiveBufferSize) As Byte
                    tcp.GetStream.Read(read, 0, tcp.ReceiveBufferSize)
                    'System.Threading.Thread.Sleep(3000)


                End If

            End If

        End Sub

    ASCII的* 符號  10進制為42,  但轉換為16進制為2A ,無法放進陣列裡面

    請各位前輩不吝指導,謝謝!

    2016年6月22日 上午 09:43

解答

  • 你要先有個概念, 十進位, 十六進位只是一種表示法. 表示法的意思就是 "人看到的樣子"

    也就是說, 你可以塞 42 給 Byte 型別變數, 也可以塞 &H2A 給 Byte 型別變數

    最後在電腦中的二進位表示都是 0010 1010 (低位元在右邊)


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

    2016年6月22日 下午 02:33
    版主
  • 你可以看看這個網址,有分成多個函數做相關應用:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=6

    不過你最好先把 Linux / Windows 的位元組順序搞清楚,一般來說,32768 一般人以為是 08 00 00 00 ,但在 Windows 記憶體中是 00 00 00 08

    通常 PLC 設備多半跟 Linux 用大排序,但是 Windows 用小排序

    所以玩 SerialPort 通訊之前,先裝 AccessPort ,監聽官方軟體通訊內容,確認位元組順序,然後自己寫的程式發送與接收的內容應該與官方軟體一致才對。


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

    2016年6月22日 下午 04:42

所有回覆

  • 就把 42 丟進去就好啦.

       Dim x As Byte
            x = 42
            x = &H2A
    這兩個寫法是同義的


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

    2016年6月22日 上午 10:03
    版主
  • 謝謝Bill,  我可能是鬼打牆了  我再試試看
    2016年6月22日 下午 01:57
  • 你要先有個概念, 十進位, 十六進位只是一種表示法. 表示法的意思就是 "人看到的樣子"

    也就是說, 你可以塞 42 給 Byte 型別變數, 也可以塞 &H2A 給 Byte 型別變數

    最後在電腦中的二進位表示都是 0010 1010 (低位元在右邊)


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

    2016年6月22日 下午 02:33
    版主
  • 你可以看看這個網址,有分成多個函數做相關應用:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=6

    不過你最好先把 Linux / Windows 的位元組順序搞清楚,一般來說,32768 一般人以為是 08 00 00 00 ,但在 Windows 記憶體中是 00 00 00 08

    通常 PLC 設備多半跟 Linux 用大排序,但是 Windows 用小排序

    所以玩 SerialPort 通訊之前,先裝 AccessPort ,監聽官方軟體通訊內容,確認位元組順序,然後自己寫的程式發送與接收的內容應該與官方軟體一致才對。


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

    2016年6月22日 下午 04:42
  • 剛好 我手上有類似的範例!提供參考

                       我是用BIN格式非ASCII

                       Dim SXD As String ="你的通訊指令"

                        Dim sendBytes As [Byte]()
                        ReDim sendBytes(SXD.Length \ 2 - 1)
                        For ix As Integer = 0 To sendBytes.Length - 1
                            sendBytes(ix) = CByte(Val("&H" & SXD.Substring(ix * 2, 2)))
                        Next
                        myobj.mySocket.Send(sendBytes, sendBytes.Length, SocketFlags.None)
                        myobj.mySocket.ReceiveTimeout = 1000
                        System.Threading.Thread.Sleep(50)
                        Dim Item2 As Integer = 1932
                        Dim bytes(Item2 + 1) As Byte
                        Dim DataBuffer(Item2 + 1) As String
                        myobj.mySocket.ReceiveFrom(bytes, 0, Item2, SocketFlags.None, myobj.PLCIpEndPoint)
                        For i As Integer = 0 To Item2 - 1
                            DataBuffer(i) = bytes(i)
                        Next
                        Read_PLC = DataBuffer


    新手上路

    2016年6月28日 上午 08:01