Private Sub Command1_Click() Dim hexSj() As String Dim hexBin() As Byte Dim hexStr As String Dim sj As String sj = "0x11,0x22,0xf9,0x55,0xf2,0x6f,0x75" hexSj = Split(sj, ",") Dim i As Integer ReDim hexBin(UBound(hexSj)) For i = 0 To UBound(hexSj) hexBin(i) = "&H" & Mid(hexSj(i), 3, 2) Next MSComm1.output = hexBin End SubPrivate Sub Form_Load() MSComm1.Settings = "9600,N,8,1" MSComm1.PortOpen = True End SubEnd Sub
Option Explicit Dim strData As String Dim bytInput() As Byte Dim dataSend() As Byte Dim yTemp() As Byte Dim SJ() As Byte Dim i As Long Dim Ulen As Long Dim Llen As Long Dim for_Sum As Long Dim Yu_sum As Integer Dim strfFleName As String Private Sub cmdOpen_Click() Dim str1 As String Dim NextLine As String Dim Txt_sj As String Dim l As Integer Dim yTemp() As Byte CommonDialog1.ShowOpen Text1 = "" strfFleName = CommonDialog1.FileName Text7 = Timer Text7.Refresh Open strfFleName For Input As #1 Do While Not EOF(1) Input #1, str1 strData = strData & Right(str1, 2) '& Chr(13) & Chr(10) Text1 = strData Loop Close ReDim yTemp(Len(strData) / 2 - 1) Dim i As Integer For i = 1 To Len(strData) Step 2 yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2) Next Ulen = UBound(yTemp) Llen = LBound(yTemp) Yu_sum = (Ulen + 1) Mod 256 for_Sum = (Ulen + 1) \ 256 Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum ReDim SJ(Ulen) For i = 0 To Ulen SJ(i) = yTemp(i) Next If for_Sum > 0 Then Timer1.Enabled = True Text2 = Timer Text2.Refresh ElseIf for_Sum = 0 Then Cmd_Dsend End If End SubPrivate Sub Form_Load() MSComm1.CommPort = 1 MSComm1.InBufferSize = 1024 MSComm1.OutBufferSize = 1024 MSComm1.Settings = "9600,n,8,1" MSComm1.PortOpen = True Text1 = "" Text2 = "" Text3 = "" Text4 = "" Timer1.Enabled = False Timer1.Interval = 10 End Sub Private Sub Timer1_Timer() '大数据包分解为多个小数据包 Static sum As Long Dim i As Integer ReDim dataSend(255) As Byte For i = 0 To 255 If sum >= for_Sum Then Exit For End If dataSend(i) = SJ(i + sum * 256) Next MSComm1.Output = dataSend sum = sum + 1 If sum >= for_Sum Then Cmd_Fsend '发送剩余字节 Text3 = Timer Text3.Refresh Timer1.Enabled = False End If End Sub Private Sub Cmd_Dsend() ReDim dataSend(Yu_sum - 1) For i = 0 To Yu_sum - 1 dataSend(i) = yTemp(i) Next MSComm1.Output = dataSend End Sub Private Sub Cmd_Fsend() Text4 = Timer Text4.Refresh If Yu_sum > 0 Then ReDim dataSend(Yu_sum - 1) For i = 0 To Yu_sum - 1 dataSend(i) = SJ(256 * for_Sum + i) Next MSComm1.Output = dataSend End If Text5 = Timer Text5.Refresh End Sub
修正错误: Private Sub cmdOpen_Click() Dim str1 As String Dim NextLine As String Dim Txt_sj As String Dim l As Integer Dim yTemp() As Byte CommonDialog1.ShowOpen Text1 = "" strfFleName = CommonDialog1.FileName Text7 = Timer Text7.Refresh Open strfFleName For Input As #1 Do While Not EOF(1) Input #1, str1 strData = strData & Right(str1, 2) '& Chr(13) & Chr(10) Loop Close Text1 = strData ReDim yTemp(Len(strData) / 2 - 1) Dim i As Integer For i = 1 To Len(strData) Step 2 yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2) Next Ulen = UBound(yTemp) Llen = LBound(yTemp) Yu_sum = (Ulen + 1) Mod 256 for_Sum = (Ulen + 1) \ 256 Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum ReDim SJ(Ulen) For i = 0 To Ulen SJ(i) = yTemp(i) Next If for_Sum > 0 Then Timer1.Enabled = True Text2 = Timer Text2.Refresh ElseIf for_Sum = 0 Then Cmd_Dsend End If End Sub
zc511624 发表于:2008-11-05 回复: Timer 函数 返回一个 Single,代表从午夜开始到现在经过的秒数。 语法 Timer 说明 Microsoft Windows中,Timer函数返回一秒的小数部分。 imer 函数示例 本示例使用 Timer 函数来暂停应用程序。同时用 DoEvents 在暂停期间将控制让给其他进程。 Dim PauseTime, Start, Finish, TotalTime If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then PauseTime = 5 ' 设置暂停时间。 Start = Timer ' 设置开始暂停的时刻。 Do While Timer < Start + PauseTime DoEvents ' 将控制让给其他程序。 Loop Finish = Timer ' 设置结束时刻。 TotalTime = Finish - Start ' 计算总时间。 MsgBox "Paused for " & TotalTime & " seconds" Else End End If
Option Explicit Dim bytInput() As Byte Dim dataSend() As Byte Dim SJ() As Byte Dim i As Long Dim strfFleName As String Private Sub cmdOpen_Click() Dim for_Sum As Long Dim Yu_sum As Integer Dim Ulen As Long Dim Llen As Long Dim strData As String Dim NextLine As String Dim yTemp() As Byte CommonDialog1.ShowOpen Text1 = "" strfFleName = CommonDialog1.FileName Text7 = Timer Text7.Refresh Open strfFleName For Input As #1 Do While Not EOF(1) Input #1, str1 strData = strData & Right(str1, 2) '& Chr(13) & Chr(10) Loop Close Text1 = strData ReDim yTemp(Len(strData) / 2 - 1) Dim i As Integer For i = 1 To Len(strData) Step 2 yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2) Next Ulen = UBound(yTemp) Llen = LBound(yTemp) Yu_sum = (Ulen + 1) Mod 256 for_Sum = (Ulen + 1) \ 256 Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum ReDim SJ(Ulen) For i = 0 To Ulen SJ(i) = yTemp(i) Next If for_Sum > 0 Then Timer1.Enabled = True Text2 = Timer Text2.Refresh ElseIf for_Sum = 0 Then Cmd_Dsend End If End SubPrivate Sub Form_Load() MSComm1.CommPort = 1 MSComm1.InBufferSize = 1024 MSComm1.OutBufferSize = 1024 MSComm1.Settings = "9600,n,8,1" MSComm1.PortOpen = True Text1 = "" Text2 = "" Text3 = "" Text4 = "" Timer1.Enabled = False Timer1.Interval = 10 End Sub Private Sub Timer1_Timer() '大数据包分解为多个小数据包 Static sum As Long Dim i As Integer ReDim dataSend(255) As Byte For i = 0 To 255 If sum >= for_Sum Then Exit For End If dataSend(i) = SJ(i + sum * 256) Next MSComm1.Output = dataSend sum = sum + 1 If sum >= for_Sum Then Cmd_Fsend '发送剩余字节 Text3 = Timer Text3.Refresh Timer1.Enabled = False End If End Sub Private Sub Cmd_Dsend() ReDim dataSend(Yu_sum - 1) For i = 0 To Yu_sum - 1 dataSend(i) = yTemp(i) Next MSComm1.Output = dataSend End Sub Private Sub Cmd_Fsend() Text4 = Timer Text4.Refresh If Yu_sum > 0 Then ReDim dataSend(Yu_sum - 1) For i = 0 To Yu_sum - 1 dataSend(i) = SJ(256 * for_Sum + i) Next MSComm1.Output = dataSend End If Text5 = Timer Text5.Refresh End Sub
Private Sub Command1_Click()
Dim hexSj() As String
Dim hexBin() As Byte
Dim hexStr As String
Dim sj As String
sj = "0x11,0x22,0xf9,0x55,0xf2,0x6f,0x75"
hexSj = Split(sj, ",")
Dim i As Integer
ReDim hexBin(UBound(hexSj))
For i = 0 To UBound(hexSj)
hexBin(i) = "&H" & Mid(hexSj(i), 3, 2)
Next
MSComm1.output = hexBin
End SubPrivate Sub Form_Load()
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
End SubEnd Sub
1. 转换后发送字符串的方法:
优点:如果对方需要字符格式,则不需要对方转换格式。
缺点:发送字符串,发送时VB要做UNICODE到ANSI转换,如果接收方是VB则要做ANSI到UNICODE的转换,浪费时间。
如果采用方法1: 一个一个字节地循环是不可避免的,但是在VB里转换非常慢,因为用到字符函数,比如Hex等,
想想,3800个字符要调用3800次函数,出入栈3800次,极大的浪费。
如果用C或者什么的写一个DLL,传递字节数组进去,返回经转换的字节数组(其实是等效的字符),利用C高效
的指针直接操作内存,效率很高,3800个字节不算什么!!! 怎么转换? 比如:0X11,则在目标数组写入0X31,0X31两字节。
楼主的1122f955.....是指字符串吧?2. 发送字节,让对方转换
优点:发送速度快。
缺点:如果格式不对,则要对方转换格式。
建议: 除非对方一定要字符或者是少量字符,要不永远不要在VB发送字符!
关于LZ在6楼说发了4000个数据,为什么接收到的数据都比4000少呢...中间的数据怎么会丢失了呀...奇怪!改怎么办啊 ?????,可详细参阅http://topic.csdn.net/u/20071114/16/de3ade11-509e-43eb-a638-0dac7bcef821.html链接的讨论.
我现在想做的就是把
0xF6,0x75,0xEF,0x7F,0xF5,0xFE,0xFA,0xF5,0xF5,0xFF,0xD5,0x81,0xBD,0xB6,0xDF,0x00,
0x3F,0xBD,0xFF,0x5D,0xFD,0x7F,0xFB,0xFF,0xFB,0xFF,0xFB,0x7F,0xF6,0xFF,0xED,0xFF,
0xFF,0x6F,0x5E,0xFF,0xEF,0xBF,0x3B,0xAE,0xF6,0xF5,0xEF,0x7F,0xF5,0xFE,0xF0,0x75,
...
...
...
(!注意它16个数为一行)这样3800个数据通过无线模块串口发送到另外一台电脑,另一台接收到的是
fe 75 ef 7f.......(“0x” 和 “,” 都没了)
最重要的是保证正确性.朋友们快来谈论下!
楼主的通信模式是这样吗: PC1 -> 无线模块1 -----> 无线模块2 -> PC2 ?
要注意:
1. 按无线模块说明书来设置协议,正规的说明书应该说明要注意什么问题的,
(工作在免费频段的小功率模块受干扰比较大,所以无线波特率不能太高)
2.PC与无线的波特率要比无线与无线的相等或小些
3.如果用USB转串口之类的设备,要留心此类设备可能有缺陷(经常断开连接或者数据量大的时候校验错等等)。zdingyun的例子已经很清楚了,稍改动即可(不会改动?),可能是你需求不是很明确,或者是基础知识欠缺些。
单单靠奇偶校验还不能保证正确性,用CRC校验能保证正确性。
0xF6,0x75,0xEF,0x7F,0xF5,0xFE,0xFA,0xF5,0xF5,0xFF,0xD5,0x81,0xBD,0xB6,0xDF,0x00,
0x3F,0xBD,0xFF,0x5D,0xFD,0x7F,0xFB,0xFF,0xFB,0xFF,0xFB,0x7F,0xF6,0xFF,0xED,0xFF,
0xFF,0x6F,0x5E,0xFF,0xEF,0xBF,0x3B,0xAE,0xF6,0xF5,0xEF,0x7F,0xF5,0xFE,0xF0,0x75,
原始文件发EMAIL
[email protected]
以便分析作出代码。
Dim strData As String
Dim bytInput() As Byte
Dim dataSend() As Byte
Dim yTemp() As Byte
Dim SJ() As Byte
Dim i As Long
Dim Ulen As Long
Dim Llen As Long
Dim for_Sum As Long
Dim Yu_sum As Integer
Dim strfFleName As String
Private Sub cmdOpen_Click()
Dim str1 As String
Dim NextLine As String
Dim Txt_sj As String
Dim l As Integer
Dim yTemp() As Byte
CommonDialog1.ShowOpen
Text1 = ""
strfFleName = CommonDialog1.FileName
Text7 = Timer
Text7.Refresh
Open strfFleName For Input As #1
Do While Not EOF(1)
Input #1, str1
strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
Text1 = strData
Loop
Close
ReDim yTemp(Len(strData) / 2 - 1)
Dim i As Integer
For i = 1 To Len(strData) Step 2
yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
Next
Ulen = UBound(yTemp)
Llen = LBound(yTemp)
Yu_sum = (Ulen + 1) Mod 256
for_Sum = (Ulen + 1) \ 256
Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
ReDim SJ(Ulen)
For i = 0 To Ulen
SJ(i) = yTemp(i)
Next
If for_Sum > 0 Then
Timer1.Enabled = True
Text2 = Timer
Text2.Refresh
ElseIf for_Sum = 0 Then
Cmd_Dsend
End If
End SubPrivate Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 1024
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
Timer1.Enabled = False
Timer1.Interval = 10
End Sub
Private Sub Timer1_Timer() '大数据包分解为多个小数据包
Static sum As Long
Dim i As Integer
ReDim dataSend(255) As Byte
For i = 0 To 255
If sum >= for_Sum Then
Exit For
End If
dataSend(i) = SJ(i + sum * 256)
Next
MSComm1.Output = dataSend
sum = sum + 1
If sum >= for_Sum Then
Cmd_Fsend '发送剩余字节
Text3 = Timer
Text3.Refresh
Timer1.Enabled = False
End If
End Sub
Private Sub Cmd_Dsend()
ReDim dataSend(Yu_sum - 1)
For i = 0 To Yu_sum - 1
dataSend(i) = yTemp(i)
Next
MSComm1.Output = dataSend
End Sub
Private Sub Cmd_Fsend()
Text4 = Timer
Text4.Refresh
If Yu_sum > 0 Then
ReDim dataSend(Yu_sum - 1)
For i = 0 To Yu_sum - 1
dataSend(i) = SJ(256 * for_Sum + i)
Next
MSComm1.Output = dataSend
End If
Text5 = Timer
Text5.Refresh
End Sub
Private Sub cmdOpen_Click()
Dim str1 As String
Dim NextLine As String
Dim Txt_sj As String
Dim l As Integer
Dim yTemp() As Byte
CommonDialog1.ShowOpen
Text1 = ""
strfFleName = CommonDialog1.FileName
Text7 = Timer
Text7.Refresh
Open strfFleName For Input As #1
Do While Not EOF(1)
Input #1, str1
strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
Loop
Close
Text1 = strData
ReDim yTemp(Len(strData) / 2 - 1)
Dim i As Integer
For i = 1 To Len(strData) Step 2
yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
Next
Ulen = UBound(yTemp)
Llen = LBound(yTemp)
Yu_sum = (Ulen + 1) Mod 256
for_Sum = (Ulen + 1) \ 256
Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
ReDim SJ(Ulen)
For i = 0 To Ulen
SJ(i) = yTemp(i)
Next
If for_Sum > 0 Then
Timer1.Enabled = True
Text2 = Timer
Text2.Refresh
ElseIf for_Sum = 0 Then
Cmd_Dsend
End If
End Sub
回复:
Timer 函数
返回一个 Single,代表从午夜开始到现在经过的秒数。
语法
Timer
说明
Microsoft Windows中,Timer函数返回一秒的小数部分。
imer 函数示例
本示例使用 Timer 函数来暂停应用程序。同时用 DoEvents 在暂停期间将控制让给其他进程。 Dim PauseTime, Start, Finish, TotalTime
If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then
PauseTime = 5 ' 设置暂停时间。
Start = Timer ' 设置开始暂停的时刻。
Do While Timer < Start + PauseTime
DoEvents ' 将控制让给其他程序。
Loop
Finish = Timer ' 设置结束时刻。
TotalTime = Finish - Start ' 计算总时间。
MsgBox "Paused for " & TotalTime & " seconds"
Else
End
End If
Dim bytInput() As Byte
Dim dataSend() As Byte
Dim SJ() As Byte
Dim i As Long
Dim strfFleName As String
Private Sub cmdOpen_Click()
Dim for_Sum As Long
Dim Yu_sum As Integer
Dim Ulen As Long
Dim Llen As Long
Dim strData As String
Dim NextLine As String
Dim yTemp() As Byte
CommonDialog1.ShowOpen
Text1 = ""
strfFleName = CommonDialog1.FileName
Text7 = Timer
Text7.Refresh
Open strfFleName For Input As #1
Do While Not EOF(1)
Input #1, str1
strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
Loop
Close
Text1 = strData
ReDim yTemp(Len(strData) / 2 - 1)
Dim i As Integer
For i = 1 To Len(strData) Step 2
yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
Next
Ulen = UBound(yTemp)
Llen = LBound(yTemp)
Yu_sum = (Ulen + 1) Mod 256
for_Sum = (Ulen + 1) \ 256
Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
ReDim SJ(Ulen)
For i = 0 To Ulen
SJ(i) = yTemp(i)
Next
If for_Sum > 0 Then
Timer1.Enabled = True
Text2 = Timer
Text2.Refresh
ElseIf for_Sum = 0 Then
Cmd_Dsend
End If
End SubPrivate Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 1024
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
Timer1.Enabled = False
Timer1.Interval = 10
End Sub
Private Sub Timer1_Timer() '大数据包分解为多个小数据包
Static sum As Long
Dim i As Integer
ReDim dataSend(255) As Byte
For i = 0 To 255
If sum >= for_Sum Then
Exit For
End If
dataSend(i) = SJ(i + sum * 256)
Next
MSComm1.Output = dataSend
sum = sum + 1
If sum >= for_Sum Then
Cmd_Fsend '发送剩余字节
Text3 = Timer
Text3.Refresh
Timer1.Enabled = False
End If
End Sub
Private Sub Cmd_Dsend()
ReDim dataSend(Yu_sum - 1)
For i = 0 To Yu_sum - 1
dataSend(i) = yTemp(i)
Next
MSComm1.Output = dataSend
End Sub
Private Sub Cmd_Fsend()
Text4 = Timer
Text4.Refresh
If Yu_sum > 0 Then
ReDim dataSend(Yu_sum - 1)
For i = 0 To Yu_sum - 1
dataSend(i) = SJ(256 * for_Sum + i)
Next
MSComm1.Output = dataSend
End If
Text5 = Timer
Text5.Refresh
End Sub