1、操作系统不断升级,越来越多的新特性需要.NET支持。
2、VB.NET编程更简单,功能更强大。
3、执行速度,以往大家总拿C与VB比较,认为C快,VB慢,但是在.NET平台下,C与外狒芙梨VB 仅仅是描述语言不同,下层执行代码完全统一,没有速度区别。关于这一点大家可以拿去和idea造婷用痃lbum.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.TickLabel1.Text = NowEnd 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) HandlesCheckBox1.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″Elsetemp += “0″End If If CheckBox2.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox3.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox4.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox5.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox6.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox7.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox8.Checked Thentemp += “1″Elsetemp += “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 1y += 1Case 2y += 2Case 3y += 4Case 4y += 8Case 5y += 16Case 6y += 32Case 7y += 64Case 8y += 128End 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″Elsetemp += “0″End If If CheckBox10.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox11.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox12.Checked Thentemp += “1″Elsetemp += “0″End IfIf CheckBox13.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox14.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox15.Checked Thentemp += “1″Elsetemp += “0″End If If CheckBox16.Checked Thentemp += “1″Elsetemp += “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 1y += 1Case 2y += 2Case 3y += 4Case 4y += 8Case 5y += 16Case 6y += 32Case 7y += 64Case 8y += 128End Select End If Next TextBox5.Text = y If Len(Hex(y)) < 2 Then TextBox6.Text = “0″ + Hex(y) ElseTextBox6.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.0J2 BIT P0.1J3 BIT P0.2J4 BIT P0.3J5 BIT P0.4J6 BIT P0.5J7 BIT P0.6J8 BIT P0.7J9 BIT P2.7J10 BIT P2.6J11 BIT P2.5J12 BIT P2.4J13 BIT P2.3J14 BIT P2.2J15 BIT P2.1J16 BIT P2.0//***********************************************************ORG 00HJMP START ORG 23HJMP UART ORG 30HSTART: MOV SP,#70H MOV SCON,#50H //设置串口为工作方式1,即波特率由定时器控制MOV TMOD,#21H //TIM1在模式2,即8位自动重装计数器模式 TIM0在模式1,即16位非自动重装计数器模式MOV TH1,#0FDH //设置定时时间MOV TL1,#0FDHSETB TR1 //启动定时器1SETB ES //允许串口中断SETB EA //允许总中断 MOV P0,#0 //P0、P2输出低电平MOV P2,#0 JMP $ //等待状态//*****************************************//串行口中断//*****************************************UART: PUSH ACC //现场保护PUSH PSWCLR ES //关闭串行口中断 MOV TH0,#00MOV TL0,#00SETB TR0 //开定时器0 MOV 30H,#00 //同步位MOV 31H,#00 //数据1MOV 32H,#00 //数据2MOV 33H,#00 //结束位 MOV R0,#30HREC:JBC TF0,FS //接收时间是否超时?是则执行FS JNB RI,REC //接收数据CLR RI MOV A,SBUFMOV @R0,AINC R0JMP RECFS: CLR TR0 //关定时器0//********************************CALL FUN //解码并控制继电器SETB ES //开串行口中断POP PSW //现场恢复POP ACCRETI //中断子程序返回 //****************************************//解码并控制继电器//下面的程序可以更简洁,但为了方便,展开来编制//****************************************FUN: MOV A,#0AH //判断第1字节即同步位CJNE A,30H,ERRMOV A,#0DH //判断第4字节即结束位CJNE A,33H,ERR//****************************************//第2字节即数据位1,代表继电器J1-8//第3字节即数据位2,代表继电器J9-16//****************************************MOV A,31HMOV P0,A MOV A,32HMOV P2,A RET//**************************************// 数据错误处理//**************************************ERR:MOV 30H,#00 //同步位MOV 31H,#00 //数据1MOV 32H,#00 //数据2MOV 33H,#00 //结束位 RET END //程序结束=========================================================
4、 另外,对于这个项目我做了一份完整的Proteus仿真,通过虚拟串口实现Proteus与上位机实现互联,当上位机选中某个继电器模块时,下位机相应的继电器动作。在下位机的程序中设置有数据校验,也满足了恶劣环境下工作的稳定性。