网上有很多关于PC机与单片机串行通讯的文章和程序,但有些不太适合初学者。我最近把网上搜集的程序消化并修改了一下,并在试验板上进行了一些简单的调试。希望对大家有用。
PC机上的程序是用VB编的,VB可以说是最容易上手的语言了,也很容易读懂。下面是VB的源程序:
Private Sub Form_Load()
MSComm1.CommPort = 1 '使用串行口1
MSComm1.Settings = "4800,N,8,1" '波特率4800,无校验,8个数据位,1个停止位。
MSComm1.InputLen = 1 '当使用MSComm1.Input时,每次从接收缓冲区取一个字节。
TestTimer.Interval = 20 '定时器的中断间隔为20ms,用于更新显示时间。
End Sub
Private Sub Command1_Click()
Dim echoch% '命令变量
Dim ch$
On Error Resume Next '简单的错误处理
Label1.Caption = MSComm1.Settings '显示串行口的设置。
TestTimer.Enabled = True
If Command1.Caption = "通信" Then '若当前命令按扭的提示为“通信”则开始发送和
Command1.Caption = "停止" '接受数据,并将命令按扭提示改为“停止”,以
CmdExit.Enabled = False '允许停止通信。使退出命令在通信中失效。
Echo.Enabled = False
If Not MSComm1.PortOpen Then '若串行口没有打开,则打开串行口
MSComm1.PortOpen = True
End If
If MSComm1.PortOpen Then '若串口已经打开,则发送连接或控制命令给单片机
If Echo.Text <> "" Then '若命令输入框不空,则将其转换为ASCII码值
echoch% = Asc(Echo.Text)
Else
echoch% = &H41 '否则确省命令为41H,ASCII的"A"
End If
MSComm1.Output = echoch% '向串行口写入一字节命令,由WINDOWS自动将命令发出
LabelSend.Caption = Chr(echoch%) & " ASCII " & Hex(echoch%) '显示刚发出的命令
End If
Do While MSComm1.PortOpen
If MSComm1.InBufferCount > 0 Then '若mscomm1.InBufferCount>0表示接受缓冲区有数据,并读出一个字符
ch$ = MSComm1.Input
LabelReceive.Caption = Asc(ch$)
Select Case ch$
Case Asc("Y") '若收到字母“Y”,则退出当前循环进入下一循环
MsgBox "连接成功,您可以给单片机发送命令了!"
Case Asc("A")
MsgBox "你发送的一号命令已经被单片机收到!"
Case Asc("B")
MsgBox "你发送的二号命令已经被单片机收到!"
Case Asc("C")
MsgBox "你发送的N号命令已经被单片机收到!"
Case Else
MsgBox "你发送了非法命令,单片机已经晕了!"
End Select
Else
If MsgBox("连接失败,请检查连接是否正确!", vbRetryCancel) = 4 Then
dummy = DoEvents()
MSComm1.Output = echoch% '否则继续向下位机发命令,通知下位机送数据
Else
Exit Do
End If
End If
dummy = DoEvents() '让系统处理其他消息
Loop '下位机接受到正确的命令,并回发命令正确时,进入下面循环
Else '在通讯过程中,按下cmdCOMM按钮则停止通信,发出停止测试
Command1.Caption = "通信" '命令,关闭串行口,使退出按钮有效。
MSComm1.Output = Chr(&H5F)
MSComm1.PortOpen = False
CmdExit.Enabled = True
Echo.Enabled = True
TestTimer.Enabled = False
End If
End Sub
Sub CmdExit_Click()
If MSComm1.PortOpen Then '确认关闭串行口
MSComm1.PortOpen = False
End If
End '终止整个程序
End Sub
Private Sub Command2_Click()
TestTimer.Enabled = True
End Sub
Private Sub TestTimer_Timer() '更新显示时间
LabTime.Caption = Time$
End Sub
如果大家感觉程序哪里有问题,请大家一起探讨。
评论