当前位置:编程学习 > VB >>

mscomm控件急问(与MSP430单片机通讯不能接收)

这个问题已经困扰了我一个多月,刚接触VB开发,头疼啊!!!

具体设计方案如下:
利用msp430单片机和nrf401无线模块做232通信
nrf401模块发射和接收是利用一个电平高低来切换的,我利用了串口里的
RTS脚,通过修改MSCOMM1.RTSENABLE来做PC端nrf401模块的切换,单片机端
利用一个IO口
PC上用VB编程,控件选用MSCOMM利用串口发送指令给nrf401模块A
这时候模块A为发射状态,模块B为接收状态,
A发射之后,切换为接收状态,B接收到数据之后交给单片机校验
如果为正确则单片机切换模块B为发射状态,将处理之后的数据通过
B发送到A

现在问题就出在如果程序连续运行就是没有数据返回,如果让单片机和PC都分别手动中断一下,然后让单片机手动运行,数据发送完成之后再让PC程序运行,这样可以接收到数据。真令人费解啊,问题出在哪里呢???
我的VB程序如下所示:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long


Dim Frame_Ok As Boolean
Dim ReBuf$
Dim OutByte() As Byte
Dim ReData() As Byte
Dim inbyte() As Byte


Private Sub Command1_Click()
Dim buf$, i%
'要发射的一帧数据
ReDim OutByte(1 To 13)
OutByte(1) = &H55
OutByte(2) = &H68
OutByte(3) = &H6
OutByte(4) = &H6
OutByte(5) = &H68
OutByte(6) = &H1
OutByte(7) = &H10
OutByte(8) = &H1
OutByte(9) = &H0
OutByte(10) = &H0
OutByte(11) = &H0
OutByte(12) = &H12
OutByte(13) = &H16

MSComm1.Output = OutByte
Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.PortOpen = False
MSComm1.RTSEnable = False 'RTS复位,进入接收状态
MSComm1.PortOpen = True

Dim t As Long
t = GetTickCount()
Do
    DataReceive
Loop Until Frame_Ok = True Or GetTickCount - t > 10000

MSComm1.PortOpen = False
MSComm1.RTSEnable = True 'RTS置位,返回发射状态
MSComm1.PortOpen = True

If Frame_Ok = True Then
    Frame_Ok = False
  MsgBox "接收成功"
        Erase ReData
   Else
        MsgBox "无数据返回"
        Erase ReData
End If
End Sub

Private Sub Command2_Click()
MSComm1.PortOpen = False
End
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.PortOpen = True
MSComm1.RTSEnable = True 'RTS置位,为发射状态
End Sub

Public Function DataReceive() As Byte()
Dim i%, j%, InByteLen%, temp%
inbyte = MSComm1.Input

For i = LBound(inbyte) To UBound(inbyte)

    If inbyte(i) = &H68 Then     '检测帧头
     CheckFrame (i)
     If Frame_Ok = True Then
       InByteLen = inbyte(i + 1)
       ReDim ReData(1 To InByteLen)
       For j = 1 To InByteLen
            ReData(j) = inbyte(i + j + 3)
       Next j
       Erase inbyte
       Exit Function
     End If
    End If
     
Next i
End Function



Public Function CheckFrame(i As Integer)  '帧校验程序,从略
End Function


//现在可以确定的是PC发射数据到了单片机,单片机做了正确的处理,也发射了正确的数据,但是PC端就是接收不到
我曾经以为是单片机端处理速度过快,在PC端还没切换为接收状态的时候就已经发射完毕,但是我在单片机端做了延时,还是接收不到数据,令人费解啊!!! --------------------编程问答-------------------- 两边工作频率不对应.单片机应该是慢.要延时也该在PC端延时. --------------------编程问答-------------------- 我在PC端做了一个循环啊
Do
    DataReceive
Loop Until Frame_Ok = True Or GetTickCount - t > 10000

难道10s之内反复的接收数据也不能解决问题? --------------------编程问答-------------------- 最好下载一个“串口调试助手”试试。
在vb那边程序太快了,vb做延时的时候要释放cpu的
写上几句onevent --------------------编程问答-------------------- 串口调试助手要去手动RTSEnable,还是等于手动的去中断单片机上的程序,
我已经验证过没有问题了
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,