我之前写过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
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
第二步:你上面的代码我看过了,只是一个通过text控件发送的程序,你接受的显示部分并没有,首先要添加一个显示的控件,并且mscomm控件你要好好看一下,MSComm1.RThreshold = 1,也就是rthreshold属性需要设置,这个是串口触发标志,设置成为1,也就是说操作系统检查,当串口接受到一个字节时,就触发串口的事件,这时你需要在串口事件里面加上显示的程序(也就是前面我告诉你添加的显示接受数据的控件,来控制它显示),楼主可以试下,我以前做过,如果需要可以给你个串口调试精灵的例程!
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
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
其次看看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 '打开串口