阅读:2088回复:12
弱问题:单片机和计算机用vb接口通讯
现有pic单片机通过232和计算机通讯,使用了vb里面的mscomm控件,inputmode=1(binary方式),rthreshold=1,有一个字节就引发oncomm事件,但是收到的数是0或者244(收数也设为binary)。改rthreshold=3,再oncomm事件里面设置一个inbyte数组(binary),照书上有句话:
for i=lbound(inbyte) to ubound(inbyte) 用这个重新定义数组大小并读数。但是vb并不执行这一指令,调试时,鼠标放到这句话上时显示:下标越界。 不知道怎么回事? |
|
|
沙发#
发布于:2002-05-03 15:14
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-05-03 19:31
那个接发数是指什么?i 么?i我申明为int型,应该可以把。
|
|
|
地板#
发布于:2002-05-03 20:24
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-05-03 21:08
好,明天我试试,然后再给你回消息!
|
|
|
5楼#
发布于:2002-05-04 18:32
我把i改为variant变量形式,还是不行。for语句的下一句到next i
都不执行。 |
|
|
6楼#
发布于:2002-05-04 20:40
用户被禁言,该主题自动屏蔽! |
|
7楼#
发布于:2002-05-05 09:08
vb里面的mscomm控件有问题,数据不能大于128 :)
|
|
8楼#
发布于:2002-05-06 15:03
现在我用一台机器做实验,com口的2,3脚接到一块,然后自发自收。发送的是文本型数据。但是接收的时候,使用了把数据在文本框中显示的语句:txtreceive.Text = buf,其中 buf=mscomm.input
调试的时候,监视窗口诊断为“上下文溢出”。我以前用mscomm做过多机通讯程序,根本就没有这么麻烦,出了这么多问题,什么原因? |
|
|
9楼#
发布于:2002-05-08 21:54
碰巧我也刚做了一个类似的程序,你看看,哪用的着,你试试看。
Public Sub InitCommControl() On Error GoTo ErrorTrap If CommControl.PortOpen Then CommControl.PortOpen = False End If CommControl.CommPort = CommPort CommControl.InputMode = comInputModeBinary CommControl.InBufferCount = 0 CommControl.InputLen = 0 CommControl.OutBufferCount = 0 CommControl.RThreshold = 1 CommControl.SThreshold = 1 CommControl.PortOpen = True Exit Sub ErrorTrap: Select Case Err.Number Case comPortAlreadyOpen MsgBox \"端口已经打开,请换一个串口试试\", , \"错误\" Case Else MsgBox \"串口错误,请换一个串口试试\", , \"错误\" End Select Err.Clear End Sub Private Sub CommControl_OnComm() Dim Buffer As Variant Dim BufferCount As Integer Dim Arr() As Byte Dim i As Integer If (CommControl.CommEvent = comEvReceive) Then If (CommControl.InBufferCount > 0) Then BufferCount = CommControl.InBufferCount Buffer = CommControl.Input Arr = Buffer For i = 0 To BufferCount - 1 InCommBuffer (Arr(i)) Next i DealCommBufferData End If End If End Sub 源程序在下 |
|
|
10楼#
发布于:2002-05-09 11:02
程序还是不行。我的程序如下:
串口的初始化: Private Sub Form_Load() \'初始化,有一位的停止位,一位的起始位 If MSComm.PortOpen Then MSComm.PortOpen = False End If MSComm.InputMode = 1 MSComm.InBufferCount = 0 \'MSComm.Settings = \"19200,n,8,1\" MSComm.InputLen = 0 MSComm.OutBufferCount = 0 \'MSComm.Handshaking = comRTS \'首先处于接收状态 MSComm.RTSEnable = True MSComm.DTREnable = True \'又一个字节输入时,引发com口中断 MSComm.RThreshold = 1 MSComm.SThreshold = 1 MSComm.PortOpen = True End Sub oncomm事件 Private Sub MSComm_OnComm() Dim bufcount As Integer Dim nowtime Dim re As Variant Dim retemp() As Byte Select Case MSComm.CommEvent Case comEdvReceive nowtime = Time If (MSComm.InBufferCount > 0) Then bufcount = MSComm.InBufferCount re = MSComm.Input \'接收数据 retemp = re End If infortxt.Text = infortxt.Text & nowtime & \" :\" & CStr(retemp(0)) & \" V\" & vbCrLf \'Next i End Select End Sub 奇怪的是:运行时,要是不在初始化的sub中加中断,然后单步执行完该sub,就不会引发oncomm事件。在oncomm事件的处理中,调试时,re显示为空,inbuffercount=1024,retemp(0)为下标越界。 Private Sub mnucomm_Click() Dim i As Integer, j As Integer Do DoEvents Loop Until MSComm.InBufferCount > 10 re = MSComm.Input For i = 0 To 9 retemp(i) = re(i) infortxt.Text = infortxt & Str(retemp(i)) & vbCrLf Next i End Sub 若用上面这个按钮事件来收数,则收到的全是0。 附:用计算机不停的发送数,然后用示波器看,发现全是毛刺波,而且幅值在2v以内。而单片机送数在232出口的波形为方波,非常规整。幅值符合232标准。 什么原因呢? |
|
|
11楼#
发布于:2002-05-11 10:47
现在总算有点进展了,谢谢各位帮忙。能用一个串口通讯了。也能收发2进制数据。但是有个问题就是,只能收固定长度的数据。如果使用lbound(),ubound()来确定数组大小的话,就会出现“上下文溢出”的问题。
|
|
|
12楼#
发布于:2002-05-12 10:49
用C(++)吧,VB的数据结构让我吐!
|
|
|