VB如何向串口发送十六进制数.docx
《VB如何向串口发送十六进制数.docx》由会员分享,可在线阅读,更多相关《VB如何向串口发送十六进制数.docx(25页珍藏版)》请在冰豆网上搜索。
VB如何向串口发送十六进制数
VB如何向串口发送十六进制数
用VB编程想把两个十六进制数按顺序从232串口发送到单片机
01h和cch
试了多种方法都不成功
用VB比VC简单多了,而且好写。
代码如下:
Private Sub Form_Load()
'初始化串口
With MSComm1
.InputMode = 1 '设置接受数据的类型是二进制类型数据
.InputLen = 8 '一次性从接收缓冲区中读取所有数据(8个字节为一组!
!
)
.InBufferCount = 0 '清空接收缓冲区
.OutBufferCount = 0 '清空发送缓冲区
.SThreshold = 0 '不触发OnComm()事件
.RThreshold = 1 '接收1个字节数据触发OnComm()事件
.Settings = "9600,N,8,1"
.CommPort = 1
.PortOpen = True
End With
End Sub
然后在按钮1中:
Private Sub Command1_Click()
Dim Data
(1) as Byte
Data(0)= &H1
Data
(1)=&HCC
'以上两个就是你要发送的数据
'下面这一句就发给单片机了
MsComm1.Oupput = Data
End Sub
至于对于单片机的反应操作则在:
Private Sub MsComm1_OnComm()
Select Case MsComm1.CommEvent
Case comEvReceive
'这里就是接收数据后的处理,一般为:
if CheckOK then
DoRight '正确数据处理
else
DoWrong '出错数据处理
end if
Case else
End Select
End Sub
End Sub
另一个方法
现在我找到了正确方法,与大家共享:
我要发送的是十六进制数据(DF1halfduplexprotocol):
100501FF先定义一个BYTE类型的数组:
dimOutString(0to3)asByte给数组赋值:
OutString(0)="&H10"OutString
(1)="&H05"OutString
(2)="&H01"OutString(3)="&HFF"发送命令:
mscomm1.out=OutString
发送并接收十六进制
'**********************************
'字符表示的十六进制数转化为相应的整数
'错误则返回-1
'**********************************
FunctionConvertHexChr(strAsString)AsInteger
DimtestAsInteger
test=Asc(str)
Iftest>=Asc("0")Andtest<=Asc("9")Then
test=test-Asc("0")
ElseIftest>=Asc("a")Andtest<=Asc("f")Then
test=test-Asc("a")+10
ElseIftest>=Asc("A")Andtest<=Asc("F")Then
test=test-Asc("A")+10
Else
test=-1'出错信息
EndIf
ConvertHexChr=test
EndFunction
'**********************************
'字符串表示的十六进制数据转化为相应的字节串
'返回转化后的字节数
'**********************************
FunctionstrHexToByteArray(strTextAsString,bytByte()AsByte)AsInteger
DimHexDataAsInteger'十六进制(二进制)数据字节对应值
DimhstrAsString*1'高位字符
DimlstrAsString*1'低位字符
DimHighHexDataAsInteger'高位数值
DimLowHexDataAsInteger'低位数值
DimHexDataLenAsInteger'字节数
DimStringLenAsInteger'字符串长度
DimAccountAsInteger'计数
strTestn=""'设初值
HexDataLen=0
strHexToByteArray=0
StringLen=Len(strText)
Account=StringLen\2
ReDimbytByte(Account)
Forn=1ToStringLen
Do'清除空格
hstr=Mid(strText,n,1)
n=n+1
If(n-1)>StringLenThen
HexDataLen=HexDataLen-1
ExitFor
EndIf
LoopWhilehstr=""
Do
lstr=Mid(strText,n,1)
n=n+1
If(n-1)>StringLenThen
HexDataLen=HexDataLen-1
ExitFor
EndIf
LoopWhilelstr=""
n=n-1
Ifn>StringLenThen
HexDataLen=HexDataLen-1
ExitFor
EndIf
HighHexData=ConvertHexChr(hstr)
LowHexData=ConvertHexChr(lstr)
IfHighHexData=-1OrLowHexData=-1Then'遇到非法字符中断转化
HexDataLen=HexDataLen-1
ExitFor
Else
HexData=HighHexData*16+LowHexData
bytByte(HexDataLen)=HexData
HexDataLen=HexDataLen+1
EndIf
Nextn
IfHexDataLen>0Then'修正最后一次循环改变的数值
HexDataLen=HexDataLen-1
ReDimPreservebytByte(HexDataLen)
Else
ReDimPreservebytByte(0)
EndIf
IfStringLen=0Then'如果是空串,则不会进入循环体
strHexToByteArray=0
Else
strHexToByteArray=HexDataLen+1
EndIf
EndFunction
以十六进制编码方式进行发送时候,发送的应该是二进制数据流,从textsend文本框中得到的只是String,应该将其转换为ByteArrey。
作为十六进制数,其中应该只包括0~9这10个数字以及A~F,或者a~f这6个字母,为了增强可读性,我们允许其中插入空格,其他的字符则应该视为非法字符。
我们约定,从头开始,每两个有效的字符作为一个字节的内容,如果有效字符的总数是奇数,则忽略最后一个单独的字符,若遇到非法字符,则对其后面的字符均不作处理。
上面的函数是实现这两个功能的。
本人想设置2个按钮,其中一个发送,一个接受,都采取十六进制编码方式,但是不知道如何将以上的函数运用进去,求高人指点~!
!
!
本人新手,全班积分送上。
实现的功能非常简单,就希望能够发送和接受十六进制编码方式的字符串,谢谢~!
!
!
!
!
!
!
PrivateSubCommand1_Click()
DimOutBuffer()AsByte
DimtemAsVariant
DimeAsInteger
DimqAsInteger
DimLenOfTextAsInteger
LenOfText=Len(txtSum.Text)/2-1
ReDimOutBuffer(LenOfText)
IfMSComm1.PortOpen=FalseThen
MSComm1.PortOpen=True
EndIf
q=0
Fore=1ToLen(txtSum.Text)Step2
tem=Mid(txtSum.Text,e,2)
OutBuffer(q)=Val("&H"&tem)
Debug.PrintVal("&H"&tem)
q=q+1
Next
MSComm1.Output=OutBuffer
EndSub
PrivateSubForm_Load()
MSComm1.CommPort=1
MSComm1.Settings="19200,N,8,1"
MSComm1.InputMode=comInputModeBinary
MSComm1.InputLen=0
MSComm1.InBufferSize=1024
MSComm1.OutBufferSize=512
MSComm1.PortOpen=True
MSComm1.SThreshold=0
MSComm1.RThreshold=1
MSComm1.InBufferCount=0
MSComm1.OutBufferCount=0
EndSub
PrivateSubMSComm1_OnComm()
OnErrorResumeNext
DimBytesReceived()AsByte
DimbufferAsString
DimHDataAsString
DimiAsInteger
SelectCaseMSComm1.CommEvent
CasecomEvReceive'接收十六进制数据。
并以十六进制显示
MSComm1.InputLen=0
buffer=MSComm1.Input'接收数据至字符串中
BytesReceived()=buffer'将数据转入Byte数组中
Fori=0ToUBound(BytesReceived)'显示结果以十六进制显示
IfLen(Hex(BytesReceived(i)))=1Then
HData=HData&"0"&Hex(BytesReceived(i))
Else
HData=HData&Hex(BytesReceived(i))
EndIf
Text1.Text=HData
'最后将结果后入Text1中
MSComm1.OutBufferCount=0'清除发送缓冲区
MSComm1.InBufferCount=0'清除接收缓冲区
MSComm1.PortOpen=False
Next
EndSelect
EndSub
利用VisualBasic实现二进制串行通信
关键词面向对象编程,二进制,
笔者在研制一个产品时,需要利用PC机对单片机进行控制,为简化单片机控制程序,节省单片机内存,通信需要采用二进制代码。
而对PC机而言,采用面向对象编程工具编程,不但人机界面漂亮,编程效率也要高得多。
但大多数Windows95环境下工作的面向对象编程工具都不支持低级语言编程,而高级编程又不支持二进制操作。
经过摸索,笔者利用VisualBasic的MSComm控件和CByte函数成功的解决了这一问题。
一、VisualBasic的MSComm控件的安装
VisualBasic的MSComm控件是一个ActiveX控件,在VisualBasic的通用控件工具箱中并没有此控件,在使用前用户需要自己安装。
安装步骤如下:
wrapblock>
stroke>
f>
f>
f>
f>
f>
f>
f>
f>
f>
f>
f>
f>
formulas>
path>lockaspectratio="t"v:
ext="edit">
lock>
shapetype>
imagedata>wraptype="topAndBottom">
wrap>
shape>
wrapblock>vglayout">1.在“工程”菜单中,单击“部件”(也可以在工具框中单击鼠标右键)以显示如下图所示的“部件”对话框。
该对话框中列出所有可加入的ActiveX控件。
2.选定控件名称左边的复选框中的MicrosoftCommControl5.0。
imagedata>wraptype="tight">
wrap>
shape>3.单击“确定”以关闭“部件”对话框。
所选定的MSComm控件将出现在工具框中。
该控件用图标表示
二、MSComm控件的加入和设置
1.用鼠标单击MSComm控件图标,并在窗口(Form)的任意位置上拖出此控件。
在程序运行时,MSComm控件并不显示。
2.建立MSComm控件与串行端口连接
使用MSComm控件的第一步是建立与串行端口的连接。
即为它确定通信端口号、设置通信参数和握手协议。
右击此控件,拉出一个快捷菜单,单击菜单上的属性栏,即出现一个如下图所示的属性设置对话框。
通信端口号根据你所使用的通信口确定,若鼠标器已使用了COM1,则你只能使用COM2。
通信参数顺序为波特率、奇偶校验、数据位和停止位。
波特率一般可设置到9600,但在一开始可以先设得低一点,例如300,等程序调通后再调高。
奇偶校验可设无(N),数据位必须设位8,停止位可设成1位或2位,在波特率较高时,设置2位停止位可提高wrapblock>
imagedata>wraptype="topAndBottom">
wrap>
shape>
wrapblock>vglayout">通信成功率。
握手协议一般使用缺省值0(comNone),即不使用握手协议。
三、打开串行端口并将它用于二进制通信
1.打开串行端口
将MSComm控件的PortOpen属性设为True,就可打开串行端口。
此语句一般写在窗口(Form)的LOAD事件中:
MSComm1.PortOpen=True
2.将接收和发送缓冲区属性设置为二进制格式
若要以二进制格式接收传入的数据,必须在窗口(Form)的LOAD事件中将MSComm控件的InputMode属性设置为comInputModeBinary常数,:
MSComm1.InputMode=comInputModeBinary
而要以二进制格式发送数据,则只要将要发送的数据定义为Byte数组类型,然后用Output属性被用来向发送缓冲区发出Byte数组变体型数据:
Dimoutbuf(3)AsByte
MSComm1.Output=outbuf
四、二进制数据的接收
在发生通讯事件(如收到数据)或错误时,将触发OnComm事件,CommEvent属性的值将被改变。
在收到数据时,CommEvent属性值为2(comEvReceive)。
因此可以在MSComm控件的OnComm事件中用Input属性将接收缓冲区的数据送到用户缓冲区,当然用户缓冲区也应该定义为Byte数组类型。
但是不能直接将赋值给一个Byte数组,这样会发生语法错误。
必须先将它赋给一个VisualBasic的Variant变量,再将Variant变量赋给一个Byte数组。
接收缓冲区中字节的数目可从InBufferCount属性中得到,将该属性的值设置为0,即可清空接收缓冲区。
如果需要获得接收缓冲区的所有内容,就必须将InputLen属性设置为0。
这可以在设计时或运行时设置。
具体接收程序如下:
rivateSubMSComm1_OnComm()
Dimst,inbuf(4)AsByte
DimmysrrAsVariant
mysrr=inbuf
IfMSComm1.CommEvent=2Then
IfMSComm1.InBufferCount>=4Then
MSComm1.InputLen=0
mysrr=MSComm1.Input
EndIf
EndIf
EndSub
五、将要发送的数据转换成二进制格式,在VisualBasic中不能直接处理二进制数据,所以必须把其它格式的常量或变量转换为二进制格式。
在Qbasic中,可以用CHAR函数来转换,但在VisualBasic5.0中,此函数只能处理小于128的数(标准ASCII码),要处理整个字节(8位),必须使用Cbyte函数,使用方法和CHAR函数相同。
例如下面这段程序发送一组四字节数据,前两个字节为识别码ED4C(16进制数),第三个字节为动作码“A”,最后一个为一个0~255的位置码:
Dimoutbuf(3)AsByte
outbuf(0)=CByte(237)
outbuf
(1)=CByte(76)
outbuf
(2)=CByte(49)
outbuf(3)=CByte(Number)
MSComm1.Output=outbuf
快乐活在当下,尽心就是完美!
**Superissuper**
QQ:
3244211,9066818
新手帮助如何获得阅读权限
回复
举报
david1981
david1981当前离线
在线时间
1小时
威望
261
金钱
8
人气
0
最后登录
2011-3-10
注册时间
2003-2-11
帖子
266
精华
0
积分
535
阅读权限
20
UID
9689
IP卡
狗仔卡
11
主题
0
听众
535
积分
中级程序员
中级程序员,积分535,距离下一级还需1465积分
擂点
0
人气
0
威望
261
注册时间
2003-2-11
精华
0
帖子
266
∙收听TA
∙发消息
3楼
发表于2003-2-2110:
08:
42|只看该作者
mscomm1.InputMode=comInputModeBinary
混天混地!
最新一期擂台题目出来了!
回复
举报
hxzfia
hxzfia当前离线
在线时间
0小时
威望
4
金钱
0
人气
0
最后登录
2003-6-9
注册时间
2003-2-20
帖子
4
精华
0
积分
0
阅读权限
10
UID
9879
IP卡
狗仔卡
2
主题
0
听众
0
积分
初级程序员
初级程序员,积分0,距离下一级还需200积分
擂点
0
人气
0
威望
4
注册时间
2003-2-20
精华
0
帖子
4
∙收听TA
∙发消息
4楼
发表于2003-2-2118:
42:
33|只看该作者
谢谢你们的答复。
但我按王苏坡说的做了一个同一个机器上,从com1发送6个十六进制数,从com2口接收的程序,测试了一下,好像还是不行(但字符发送和接收很容易)。
有没有调试过的源程序可以借鉴。
谢谢
回复
举报
hxzfia
hxzfia当前离线
在线时间