` 千万不要因为Microsoft Visual Studio 2008的开发环境太庞大而不去使用它。Microsoft Visual Studio是基于.NET的开发环境,你可以通过网络找到它,全部文件包括MSDN联机文档大概3.7G,Microsoft Visual Studio 2008 其实包括了VB.NETVC.NETC#J#ASP等众多开发语言。另外,VB与VB.NET的差别也是很大的: 1、操作系统不断升级,越来越多的新特性需要.NET支持。 2、VB.NET编程更简单,功能更强大。 3、执行速度,以往大家总拿C与VB比较,认为C快,VB慢,但是在.NET平台下,C与VB 仅仅是描述语言不同,下层执行代码完全统一,没有速度区别。关于这一点大家可以拿去和idealbum.com的上一个项目“串口调试助手VB版”做个比较,差距还是很明显的。 既然是大势所趋,所以最好还是转向.NET的开发为好。以下的串口控制继电器就是基于VB.NET开发的,原来由马工出品,后经我个人修正了部分BUG并仿真与调试了下位机,作为基础项目,也算是比较完美了。
- 上位机VB.NET源码:
- Public Class Form1
- Private Sub timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- Label1.Text = Now
- End Sub
- Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- Me.Close()
- End Sub
- Dim temp As String = “”
- Dim x, y, z As Integer
- Dim send As Byte()
- Dim buff As String
- Dim DATA1, DATA2 As String
- Private Sub CheckBox_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
- CheckBox1.CheckedChanged,CheckBox2.CheckedChanged,CheckBox3.CheckedChanged,
- CheckBox4.CheckedChanged,CheckBox5.CheckedChanged,CheckBox6.CheckedChanged,CheckBox7.CheckedChanged,
- CheckBox8.CheckedChanged,CheckBox9.CheckedChanged,CheckBox10.CheckedChanged,CheckBox11.CheckedChanged,
- CheckBox12.CheckedChanged,CheckBox13.CheckedChanged,CheckBox14.CheckedChanged,CheckBox15.CheckedChanged,
- CheckBox16.CheckedChanged
- temp = “”
- If CheckBox1.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox2.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox3.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox4.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox5.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox6.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox7.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox8.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- TextBox1.Text = temp
- ‘*******************************************************
- ‘二进制文本转换为10进制
- ‘*******************************************************
- y = 0
- ‘ temp = “10010010″
- For x = 1 To 8
- z = Mid(temp, x, 1)
- If z = 1 Then
- Select Case x
- Case 1
- y += 1
- Case 2
- y += 2
- Case 3
- y += 4
- Case 4
- y += 8
- Case 5
- y += 16
- Case 6
- y += 32
- Case 7
- y += 64
- Case 8
- y += 128
- End Select
- End If
- Next
- TextBox2.Text = y
- ‘*******************************************************
- ’10进制文本转换为16进制
- ‘*******************************************************
- If Len(Hex(y)) < 2 Then
- TextBox3.Text = “0″ + Hex(y)
- Else
- TextBox3.Text = Hex(y)
- End If
- ‘*****************************************************
- temp = “”
- If CheckBox9.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox10.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox11.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox12.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox13.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox14.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox15.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- If CheckBox16.Checked Then
- temp += “1″
- Else
- temp += “0″
- End If
- TextBox4.Text = temp
- y = 0
- ‘ temp = “10010010″
- For x = 1 To 8
- z = Mid(temp, x, 1)
- If z = 1 Then
- Select Case x
- Case 1
- y += 1
- Case 2
- y += 2
- Case 3
- y += 4
- Case 4
- y += 8
- Case 5
- y += 16
- Case 6
- y += 32
- Case 7
- y += 64
- Case 8
- y += 128
- End Select
- End If
- Next
- TextBox5.Text = y
- If Len(Hex(y)) < 2 Then
- TextBox6.Text = “0″ + Hex(y)
- Else
- TextBox6.Text = Hex(y)
- End If
- DATA1 = TextBox3.Text
- DATA2 = TextBox6.Text
- buff = “0A” + DATA1 + DATA2 + “0D”
- TextBox7.Text = buff
- STRTOBIN() ‘文本转换为二进制,通过串口发送二进制数据
- ‘********************************
- ‘通过端口发送命令, ‘文本转换为二进制,通过串口发送二进制数据
- Try
- AxMSComm1.CommPort = 1 ‘”1″ ‘参数设置 设端口号
- AxMSComm1.Settings = “9600,n,8,1″ ‘ 设波特率
- AxMSComm1.PortOpen = True ‘打开端口
- AxMSComm1.Output = SEND
- AxMSComm1.PortOpen = False ‘关闭端口
- ToolStripStatusLabel1.Text = (“发送成功!” + “ 端口” + Str(AxMSComm1.CommPort) + “ ” + “ 设置” + AxMSComm1.Settings) ‘ 显示状态
- Catch ex As Exception
- MsgBox(“发送失败!端口可能被占用或是无效的端口!”)
- End Try
- End Sub
- ‘*******************************************************
- ‘文本转换为二进制,通过串口发送二进制数据
- ‘*******************************************************
- Public Sub STRTOBIN()
- ‘文本转换为二进制,通过串口发送二进制数据
- Dim X As Integer = 1
- Dim Y As Integer = Len(buff)
- Dim z As Integer = 0
- ‘ Dim SEND As Byte()
- ReDim SEND(Y / 2 – 1)
- While X < Y
- SEND(z) = Val(“&H” + (Mid(buff, X, 2)))
- z += 1
- X += 2
- End While
- ‘ AxMSComm1.Output = SEND
- End Sub
- End Class
复制代码
- 下位机的程序至关重要,在这里我是用汇编来写的,一来简洁,二来高效。代码如下:
- //--------------------------------------------------
- //设置串行口 波特率9600
- //串行口设置MODE1,SM0=0,SM1=1,SMOD=0
- //晶振11.0592,定时设置为0FDH
- //常用端口设置参数
- //FD 9600
- //FA 4800
- //F4 2400
- //E8 1200
- //--------------------------------------------------
- //***********************************************************
- //定义端口
- //***********************************************************
- J1 BIT P0.0
- J2 BIT P0.1
- J3 BIT P0.2
- J4 BIT P0.3
- J5 BIT P0.4
- J6 BIT P0.5
- J7 BIT P0.6
- J8 BIT P0.7
- J9 BIT P2.7
- J10 BIT P2.6
- J11 BIT P2.5
- J12 BIT P2.4
- J13 BIT P2.3
- J14 BIT P2.2
- J15 BIT P2.1
- J16 BIT P2.0
- //***********************************************************
- ORG 00H
- JMP START
- ORG 23H
- JMP UART
- ORG 30H
- START: MOV SP,#70H
- MOV SCON,#50H //设置串口为工作方式1,即波特率由定时器控制
- MOV TMOD,#21H //TIM1在模式2,即8位自动重装计数器模式 TIM0在模式1,即16位非自动重装计数器模式
- MOV TH1,#0FDH //设置定时时间
- MOV TL1,#0FDH
- SETB TR1 //启动定时器1
- SETB ES //允许串口中断
- SETB EA //允许总中断
- MOV P0,#0 //P0、P2输出低电平
- MOV P2,#0
- JMP $ //等待状态
- //*****************************************
- //串行口中断
- //*****************************************
- UART: PUSH ACC //现场保护
- PUSH PSW
- CLR ES //关闭串行口中断
- MOV TH0,#00
- MOV TL0,#00
- SETB TR0 //开定时器0
- MOV 30H,#00 //同步位
- MOV 31H,#00 //数据1
- MOV 32H,#00 //数据2
- MOV 33H,#00 //结束位
- MOV R0,#30H
- REC:
- JBC TF0,FS //接收时间是否超时?是则执行FS
- JNB RI,REC //接收数据
- CLR RI
- MOV A,SBUF
- MOV @R0,A
- INC R0
- JMP REC
- FS: CLR TR0 //关定时器0
- //********************************
- CALL FUN //解码并控制继电器
- SETB ES //开串行口中断
- POP PSW //现场恢复
- POP ACC
- RETI //中断子程序返回
- //****************************************
- //解码并控制继电器
- //下面的程序可以更简洁,但为了方便,展开来编制
- //****************************************
- FUN: MOV A,#0AH //判断第1字节即同步位
- CJNE A,30H,ERR
- MOV A,#0DH //判断第4字节即结束位
- CJNE A,33H,ERR
- //****************************************
- //第2字节即数据位1,代表继电器J1-8
- //第3字节即数据位2,代表继电器J9-16
- //****************************************
- MOV A,31H
- MOV P0,A
- MOV A,32H
- MOV P2,A
- RET
- //**************************************
- // 数据错误处理
- //**************************************
- ERR:
- MOV 30H,#00 //同步位
- MOV 31H,#00 //数据1
- MOV 32H,#00 //数据2
- MOV 33H,#00 //结束位
- RET
- END //程序结束
复制代码
另外,对于这个项目我做了一份完整的proteus仿真,通过虚拟串口实现Proteus与上位机实现互联,当上位机选中某个继电器模块时,下位机相应的继电器动作。在下位机的程序中设置有数据校验,也满足了恶劣环境下工作的稳定性。
`
|