VB如何向串口发送十六进制数.docx

上传人:b****5 文档编号:6488489 上传时间:2023-01-07 格式:DOCX 页数:25 大小:49.70KB
下载 相关 举报
VB如何向串口发送十六进制数.docx_第1页
第1页 / 共25页
VB如何向串口发送十六进制数.docx_第2页
第2页 / 共25页
VB如何向串口发送十六进制数.docx_第3页
第3页 / 共25页
VB如何向串口发送十六进制数.docx_第4页
第4页 / 共25页
VB如何向串口发送十六进制数.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

VB如何向串口发送十六进制数.docx

《VB如何向串口发送十六进制数.docx》由会员分享,可在线阅读,更多相关《VB如何向串口发送十六进制数.docx(25页珍藏版)》请在冰豆网上搜索。

VB如何向串口发送十六进制数.docx

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当前离线

在线时间

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1