串口通信最終都是用二進制傳輸?shù)模阌么a把二進制轉(zhuǎn)化成十六進制就可以了。不需要額外設置。
站在用戶的角度思考問題,與客戶深入溝通,找到海南州網(wǎng)站設計與海南州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、國際域名空間、虛擬主機、企業(yè)郵箱。業(yè)務覆蓋海南州地區(qū)。
大概看了下。有變量定義類型錯誤,修改如下:
Public
Function
crc16(ByRef
cmdstring()
As
Byte,
DataLen
As
Integer)
As
String
Dim
data
As
Integer
Dim
i
As
Integer
Dim
CRCHi
As
long,
CRCLo
As
long'這里應該定義為long.因為下面賦值是long型。朋友。
Dim
iIndex
As
Long
Dim
CRCStr
As
String
Dim
DataStr
As
String
CRCLo
=
HFF'看這里的賦值。long型
CRCHi
=
HFF
For
i
=
To
DataLen
iIndex
=
CRCLo
Xor
cmdstring(i)
CRCLo
=
CRCHi
Xor
GetCRCLo(iIndex)
'低位處理
CRCHi
=
GetCRCHi(iIndex)
'高位處理
DataStr
=
DataStr
Chr(cmdstring(i))
Next
i
Dim
ReturnData(1)
As
Byte
ReturnData(1)
=
CRCHi
ReturnData(0)
=
CRCLo
CRCStr
=
StrConv(ReturnData,
vbUnicode)
crc16
=
DataStr
+
CRCStr
End
Function
'Text1.Text 輸入數(shù)據(jù)
'Text2.Text 輸出數(shù)據(jù)
Dim ReturnData(1) As Byte
Private Sub Command1_Click()
Dim CRC(2) As Byte
Dim d(6) As Byte '待傳輸數(shù)據(jù)
ReDim data(7) As Byte
For i = 0 To 5
data(i) = "h" + Mid(Text1.Text, 2 * i + 1, 2)
Debug.Print data(i)
Next i
Call CRC16(data, UBound(data) - 2, data(6), data(7)) '調(diào)用CRC16計算函數(shù)
' CRC(0)為高位
' CRC(1)為低位
End Sub
Function CRC16(data() As Byte, i As Integer, ByRef ReturnDatalo As Byte, ByRef ReturnDatahi As Byte) As String
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim CL As Byte, CH As Byte '多項式碼HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim Flag As Integer
CRC16Lo = HFF
CRC16Hi = HFF
CL = H1
CH = HA0
For i = 0 To UBound(data) - 2
CRC16Lo = CRC16Lo Xor data(i) '每一個數(shù)據(jù)與CRC寄存器進行異或
For Flag = 0 To 9
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And H1) = H1) Then '如果高位字節(jié)最后一位為1
CRC16Lo = CRC16Lo Or H80 '則低位字節(jié)右移后前面補1
End If '否則自動補0
If ((SaveLo And H1) = H1) Then '如果LSB為1,則與多項式碼進行異或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next Flag
Next i
ReturnDatahi = CRC16Hi 'CRC高位
ReturnDatalo = CRC16Lo 'CRC低位
Debug.Print Hex(CRC16Lo), Hex(CRC16Hi)
Text2.Text = Text1.Text Hex(CRC16Lo) Hex(CRC16Hi)
End Function
很有意思。
原文數(shù)據(jù)全為:“00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ”
加密后變成了:“09 51 55 F4 FB 10 6F A4 D3 E8 87 46 F8 2F 49 CD ; ”
得出這樣的結(jié)果是有很多方法都可以實現(xiàn)的:
比如每個原數(shù)上加上個常數(shù)就可以了。
00+09=09;得出第一組加密后的數(shù)值
00+51=51;得出第二組加密后的數(shù)值
...
00+CD=CD;得出第16組加密后的數(shù)值.
加密的方法還有很多,不過這種最簡單。
還有就是你給的原文太單一了,不能夠更好的分析數(shù)據(jù)的規(guī)律。
如果你能把原文改為如下這段代碼再去加密一下,再把加密結(jié)果貼上來看一下就好多了。
00000140h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;
00000160h: 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 ; 00000170h: 00 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0 ;
00000180h: 11 11 11 11 11 22 22 22 22 22 22 EE EE EE FF FF ;
以上是單片機高手團為您解答。
如果還沒解決你的問題,可以加我百度HI賬號。
應該是你的轉(zhuǎn)換格式不正確,下面代碼就是將文本框中以一個空格隔開的十六進制轉(zhuǎn)為字節(jié)的代碼,文本框中數(shù)字格式為:01 02 03
Dim TestArray() As String = Split(TextBox1.Text)
Dim hexBytes() As Byte
ReDim hexBytes(TestArray.Length - 1)
Dim i As Integer
For i = 0 To TestArray.Length - 1
hexBytes(i) = Val("h" TestArray(i))
Next
SerialPort.Write(hexBytes, 0, hexBytes.Length)
如果有問題可以再聯(lián)系。
把c的做成dll直接調(diào)用不就行了
Function CRC16_0(data() As Byte) As Long
Dim p1 As Long
Dim datalen As Long
datalen=UBound(data)
p1=VarPtr(data(1))
CRC16_0= cal_crc(p1,datalen)
End Function
當前名稱:vb.netcrc16,vb crc16
文章路徑:http://vcdvsql.cn/article12/hshodc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設、動態(tài)網(wǎng)站、品牌網(wǎng)站設計、外貿(mào)建站、面包屑導航、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)