这个问题已经困扰了我一个多月,刚接触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) = &H16MSComm1.Output = OutByte
Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.PortOpen = False
MSComm1.RTSEnable = False 'RTS复位,进入接收状态
MSComm1.PortOpen = TrueDim t As Long
t = GetTickCount()
Do
    DataReceive
Loop Until Frame_Ok = True Or GetTickCount - t > 10000MSComm1.PortOpen = False
MSComm1.RTSEnable = True 'RTS置位,返回发射状态
MSComm1.PortOpen = TrueIf Frame_Ok = True Then
    Frame_Ok = False
  MsgBox "接收成功"
        Erase ReData
   Else
        MsgBox "无数据返回"
        Erase ReData
End If
End SubPrivate Sub Command2_Click()
MSComm1.PortOpen = False
End
End SubPrivate Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.PortOpen = True
MSComm1.RTSEnable = True 'RTS置位,为发射状态
End SubPublic Function DataReceive() As Byte()
Dim i%, j%, InByteLen%, temp%
inbyte = MSComm1.InputFor 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 FunctionPublic Function CheckFrame(i As Integer)  '帧校验程序,从略
End Function
//现在可以确定的是PC发射数据到了单片机,单片机做了正确的处理,也发射了正确的数据,但是PC端就是接收不到
我曾经以为是单片机端处理速度过快,在PC端还没切换为接收状态的时候就已经发射完毕,但是我在单片机端做了延时,还是接收不到数据,令人费解啊!!!