我之前写过VB和单片机通信的程序,vb向单片机发送正常(但单片机判断时,原本用十六进制但是没有做出来只好改成十进制)单片机就收VB发送的数据后通过比较后由数码管显示 ,但目前存在问题是我单片机向VB发送的数据我就收不到请各位大哥大姐指教指教。
VB程序如下:
Private Sub Command1_Click()
Dim sdata() As Byte
Dim strbuff As String
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
MSComm1.PortOpen = True
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
If Text2.Text = "" Then
MsgBox ("请输入要发送的数据")
Else
MSComm1.Output = Chr(Val(Text2.Text))
Text3.Text = Text2.Text
MSComm1.InputMode = comInputModeBinary
strbuff = MSComm1.Input
sdata = strbuff
Text1.Text = strdata
End Sub
单片机程序如下:
 ORG 00H
 AJMP MAIN
 ORG 0035H
MAIN:  MOV SP,#60H
       MOV TMOD,#20H
LOOP:  MOV TH1,#0D0H
   MOV TL1,#0D0H
   SETB TR1
   MOV PCON,#80H
   MOV SCON,#60H
WAIT1: JNB RI,WAIT1
   CLR RI
   CJNE A,#00H,SJ1;判断是十六进制0则数码管显示0
   MOV P2,#0C0H
   LCALL DELAY
   MOV P2,#0FFH
   MOV A,#00H ;向VB发送十六进制0
   MOV SBUF,A
WAIT2: JNB TI,WAIT2
   CLR TI
   LJMP LOOP
SJ1:   CJNE A,#01H,SJ2
       MOV P2,#0F9H
   LCALL DELAY
   MOV P2,#0FFH
   MOV A,#01H
   MOV SBUF,A
WAIT3: JNB TI,WAIT3
   CLR TI
   LJMP LOOP
SJ2:   CJNE A,#02H,SJ3
       MOV P2,#0A4H
   LCALL DELAY
   MOV P2,#0FFH
   MOV A,#02H
   MOV SBUF,A
WAIT4: JNB TI,WAIT4
   CLR TI
   LJMP LOOP
SJ3:   CJNE A,#03H,SJ4
   MOV P2,#0B0H
   LCALL DELAY
   MOV P2,#0FFH
   MOV A,#03H
   MOV SBUF,A
WAIT5: JNB TI,WAIT5
   CLR TI
   LJMP LOOP
SJ4:   CJNE A,#04H,SJ5
   MOV P2,#99H
   LCALL DELAY
   MOV P2,#0FFH
   MOV A,#04H
   MOV SBUF,A
WAIT6: JNB TI,WAIT6
   CLR TI
   LJMP LOOP
SJ5:   CJNE A,#05H,SJ6
       MOV P2,#92H
   LCALL DELAY
   MOV P2,#0FFH
   MOV A,#05H
   MOV SBUF,A
WAIT7: JNB TI,WAIT7
   CLR TI
   LJMP LOOP
SJ6:   CJNE A,#0AH,SJ7
       MOV P2,#88H
   LCALL DELAY
   MOV P2,#0FFH
   MOV A,#0AH
   MOV SBUF,A
WAIT8: JNB TI,WAIT8
   CLR TI
   LJMP LOOP
SJ7:   MOV P2,#0BFH
   LCALL DELAY
   LCALL DELAY
   MOV P2,#0FFH
   LJMP LOOP
DELAY:MOV R7,#10
   D1:MOV R6,#200
   D2:MOV R5,#248
      DJNZ R5,$
      DJNZ R6,D2
      DJNZ R7,D1
      RET
END

解决方案 »

  1.   

    第一步:你要确定单片机的串口是否发送出了数据,这个很简单,你通过串口发一个方波,然后用示波器看一下!如果有,再进行下面的排查
    第二步:你上面的代码我看过了,只是一个通过text控件发送的程序,你接受的显示部分并没有,首先要添加一个显示的控件,并且mscomm控件你要好好看一下,MSComm1.RThreshold = 1,也就是rthreshold属性需要设置,这个是串口触发标志,设置成为1,也就是说操作系统检查,当串口接受到一个字节时,就触发串口的事件,这时你需要在串口事件里面加上显示的程序(也就是前面我告诉你添加的显示接受数据的控件,来控制它显示),楼主可以试下,我以前做过,如果需要可以给你个串口调试精灵的例程!
      

  2.   

    你的VB发送接收代码修改如下:Option Explicit
        Dim strData As String
    Private Sub Command1_Click()
        Dim sData() As Byte
        Dim strbuff As String
        If MSComm1.PortOpen = True Then
            MSComm1.PortOpen = False
        End If
        MSComm1.PortOpen = True
        MSComm1.OutBufferCount = 0
        MSComm1.InBufferCount = 0
        If Text2.Text = "" Then
            MsgBox ("请输入要发送的数据")
        Else
        MSComm1.Output = Chr(Val(Text2.Text))
        Text3.Text = Text2.Text
        MSComm1.InputMode = comInputModeBinary
        strbuff = MSComm1.Input
        sData = strbuff
        Dim i As Integer
        For i = 0 To UBound(sData)
            If Len(Hex(sData(i))) = 1 Then '将接收的 Byte类型sData数组转换为16进制字符串显示
                strData = strData & "0" & Hex(sData(i))
            Else
                strData = strData & Hex(sData(i))
            End If
        Next
        Text1.Text = strData
    End Sub
      

  3.   


    Option Explicit
        Dim strData As String
    Private Sub Form_Load()
        MSComm1.RThreshold = 1
        MSComm1.InputMode = comInputModeText
        MSComm1.PortOpen = True
    End SubPrivate Sub mscomm1_OnComm()
        Dim intInputLen As Integer
        Select Case Me.MSComm1.CommEvent
            Case comEvReceive
            strData = Me.MSComm1.Input
            '写接收数据处理代码        End Select
    End Sub
      

  4.   

    首先确定串口是否工作正常,下载个串口助手,调试单片机串口
    其次看看mscomm属性设置,例如这样设置    '设置串口属性, 打开串口    MSComm1.CommPort = 1                        '设置或返回端口号   
        MSComm1.InBufferSize = 1024                 '设置接收缓冲区的大小
        MSComm1.Settings = "115200,n,8,1"           '设置并返回通讯参数,值为字符串String行
        'MSComm1.Settings = BaudRate & ",n,8,1"
        MSComm1.InputLen = 0                        '设置或返回,从接收缓冲区读取的字符数,0时(默认),读取缓冲区全部字符
        MSComm1.RThreshold = 1                      '接收区的“门阀值”,0时(默认),不产生OnComm事件;1时,接收缓冲区每接收到一个字符,都会产生OnComm事件
        MSComm1.SThreshold = 1                      '发送区的“门阀值”,0时(默认),不产生OnComm事件;1时,发送缓冲区每接收到一个字符,都会产生OnComm事件
        MSComm1.InBufferCount = 0
        MSComm1.InputMode = comInputModeText        '以文本方式取回传入的数据,既comInputModeText = 0
       MSComm1.PortOpen = True                    '打开串口