这里写的是上位机基本的程序,有什么额外功能的话可以自己加上。我是参与别人项目里做的,主要实现了自动检测,断点重连,发送检测消息。因为要实时使用,所以要最大程度的避免程序崩溃,因此程序里使用了比较多的try模块。同是为了让别人使用起来方便,没有做其他修饰的东西。

Public Class Form1//用到的全局变量Public socketi As Net.Sockets.Socket'套接字Dim funct As StringDim funct1 As String = "Speed_LocPIDInit"Dim funct2 As String = "Angle_LocPIDInit"Dim Aip As String'该客户端ipDim Aport As String'该客户端portDim fg As Boolean = True'它的值表示连接是否正常Dim reg As Boolean = TrueDim Acc As Timers.Timer '接受服务器信息的定时器Dim Isone As Boolean = TrueDim Lock_syn As New Object()'线程锁Dim Send_Timer As Timers.Timer'定时发送消息的定时器Dim end_start As Boolean'///'按下左上角的X是调用该过程,关闭定时器,套接字等。Public Sub Ending()Trysocketi.Close()Catch ce As ExceptionEnd TryTryCh.Abort()Catch ex As ExceptionEnd TryTry'    Th.Abort()Acc.Stop()Catch ex As ExceptionEnd TryTrySend_Timer.Stop()Catch ex As ExceptionEnd Tryfg = TrueEnd Sub'
'定时发送所调用的过程Public Sub Time_Send()Dim str As String = "test" & Now().ToString()'当前的时间Dim encText As New System.Text.UTF8Encoding()Dim btText() As BytebtText = encText.GetBytes(str)Trysocketi.Send(btText)Catch ie As ExceptionEnd TryEnd Sub'/
'自动检测连接是否断开,如果断开,则一直尝试重连并且每次重连会显示出来Public Sub Ch_fun()Dim str As Int32 = 1Dim cf As Int32 = 1While 1Threading.Thread.Sleep(80)If fg = False Then' 10035 == WSAEWOULDBLOCKsocketi.Close()Button1.Enabled = TrueButton2.Enabled = FalseLabel11.Text = "连接断开,正在重连"Dim LocalEndPoint As New Net.IPEndPoint(Net.IPAddress.Parse(Aip), CInt(Aport))Dim client As Net.Sockets.Socket = Nothingclient = New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)'尝试重连While 1TryLabel11.Text = "第" & str.ToString() & "次重连"str = str + 1client.Connect(LocalEndPoint)socketi = clientDim tmp(0) As Bytesocketi.Blocking = Falsesocketi.Send(tmp, 0, 0)Label11.Text = "连接正常"socketi.Blocking = TrueButton2.Enabled = Truestr = 1fg = TrueExit WhileCatch ex As ExceptionLabel11.Text = "连接断开,正在重连"Threading.Thread.Sleep(1000)Continue WhileEnd TryEnd WhileElseLabel11.Text = "连接正常"cf = cf + 1TextBox10.Text = cf.ToString()End IfEnd WhileEnd Sub''接收消息所用的过程Public Sub Task()If fg = False ThenExit SubEnd IfAcc.Enabled = False'接受消息可能会堵塞,设置该值是为了防止重复触发Dim str As New Text.StringBuilderDim str2 As String = NothingDim str3 As String = NothingDim by(100) As ByteDim ch(100) As CharDim ch1(100) As CharDim err As Int32Tryerr = socketi.Receive(by)Catch e As Exception'err<0说明连接出问题fg = FalseAcc.Enabled = TrueExit SubEnd TryIf err > 0 Thenstr.Append(System.Text.ASCIIEncoding.ASCII.GetString(by, 0, by.Length()))'Dim str1 As String = str.ToString()TextBox4.AppendText(vbNewLine & str1)TextBox4.ScrollToCaret()ElseIf err <= 0 Thenfg = FalseAcc.Enabled = TrueExit SubEnd IfAcc.Enabled = TrueEnd Sub
'//
'连接过程Public Sub connecting()Ending()'启动新连接前把上个连接关闭。fg = TrueDim flag As Int32 = 1Dim Ip As String = NothingDim Port As String = NothingIp = TextBox1.TextAip = IpWhile Ip Is ""MsgBox("请输入Ip地址", MsgBoxStyle.OkOnly, Me.Text)ReturnEnd WhilePort = TextBox2.TextAport = PortWhile Port Is ""MsgBox("请输入Port地址", MsgBoxStyle.OkOnly, Me.Text)ReturnEnd While'///链接代码Dim LocalEndPoint As New Net.IPEndPoint(Net.IPAddress.Parse(Ip), CInt(Port))Dim client As Net.Sockets.Socket = Nothingclient = New Net.Sockets.Socket(Net.Sockets.AddressFamily.InterNetwork, Net.Sockets.SocketType.Stream, Net.Sockets.ProtocolType.Tcp)' This is how you can determine whether a socket is still connected.Dim blockingState As Boolean = client.BlockingTryclient.Connect(LocalEndPoint)socketi = clientDim tmp(0) As Byteclient.Blocking = Trueclient.Send(tmp, 0, 0)MsgBox("Connected!")Catch ie As Exception' 10035 == WSAEWOULDBLOCKMsgBox("connet failed!, please check your Ip, Port", MsgBoxStyle.Exclamation)Button1.Enabled = TrueReturnFinallyclient.Blocking = blockingStateEnd Try'end_start = Falseclient.Blocking = True'MsgBox("Connected: {0}", client.Connected)If flag <> 1 ThenReturnEnd If'初始化Ch,AccCh = New Threading.Thread(AddressOf Ch_fun)Ch.Start()Acc = New Timers.Timer(80)Send_Timer = New Timers.Timer(FormatNumber(TextBox11.Text()))AddHandler Acc.Elapsed, AddressOf TaskAcc.Start()AddHandler Send_Timer.Elapsed, AddressOf Time_SendSend_Timer.Start()End Sub
'//
'开始时设置默认参数Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadTextBox1.Text = "127.0.0.1"TextBox2.Text = "8888"TextBox8.Text = "8"TextBox5.Text = "2"TextBox6.Text = "60"TextBox7.Text = "18"TextBox9.Text = "5"TextBox11.Text = "500"connecting()End Sub
'
'连接按钮触发事件Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickLabel11.Text = ""connecting()End Sub'///
'发送按钮Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickDim str As String = Nothingstr = TextBox3.TextIf str Is "" ThenMsgBox("请输入数据", MsgBoxStyle.Information)ReturnEnd If''下面注释的程序是为了获取服务器返回的参数,可以忽略。Dim fun(40) As Char'Dim can1(20) As Char'Dim can2(20) As Char'Dim can3(20) As Char'Dim i As Int32 = 0, j As Int32 = 0'Dim size As Int32 = str.Length'While i < size'    If str.Chars(i) = "("c Then'        Exit While'    End If'    fun(j) = str.Chars(i)'    j = j + 1'    i = i + 1'End While'i = i + 1'j = 0'While i < size'    If str.Chars(i) = ","c Then'        Exit While'    End If'    can1(j) = str.Chars(i)'    j = j + 1'    i = i + 1'End While'i = i + 1'j = 0'While i < size'    If str.Chars(i) = ","c Or str.Chars(i) = ")"c Then'        Exit While'    End If'    can2(j) = str.Chars(i)'    j = j + 1'    i = i + 1'End While'i = i + 1'j = 0'While i < size'    If str.Chars(i) = ","c Or str.Chars(i) = ")"c Then'        Exit While'    End If'    can3(j) = str.Chars(i)'    j = j + 1'    i = i + 1'End WhileIf socketi.Connected = False ThenReturnEnd IfDim str1 As String = TextBox4.TextIf str1 <> "" ThenTextBox4.AppendText(vbNewLine & str & vbNewLine)ElseTextBox4.AppendText(str & vbNewLine)End IfTextBox4.ScrollToCaret()End Sub
'///
'断开按钮Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.ClickTrysocketi.Close()Catch be As ExceptionEnd TryTryCh.Abort()Catch ex As ExceptionEnd TryTry'    Th.Abort()Acc.Stop()Catch ex As ExceptionEnd TryTry'    Send_Timer.Stop()Catch ex As ExceptionEnd TryMsgBox("连接断开")reg = TrueButton1.Enabled = TrueButton2.Enabled = TrueLabel11.Text = "状态"SyncLock Lock_synIsone = TrueEnd SyncLockEnd SubPrivate Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.ClickDim str1 As String = funct1Dim str2 As String = TextBox8.TextDim str3 As String = TextBox5.TextDim str4 As String = TextBox6.TextDim str5 As Stringstr5 = str1 & "(" & str2 & "," & str3 & "," & str4 & ")" & vbNewLineDim encText As New System.Text.UTF8Encoding()Dim btText() As BytebtText = encText.GetBytes(str5)socketi.Send(btText)Dim s As String = TextBox4.TextTextBox4.AppendText(vbNewLine & str5 & vbNewLine)TextBox4.ScrollToCaret()End SubPrivate Sub TextBox8_TextChanged(sender As Object, e As EventArgs) Handles TextBox8.TextChangedEnd SubPrivate Sub Label4_Click_1(sender As Object, e As EventArgs) Handles Label4.ClickEnd SubPrivate Sub TextBox6_TextChanged(sender As Object, e As EventArgs) Handles TextBox6.TextChangedEnd SubPrivate Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.ClickDim str1 As String = funct2Dim str2 As String = TextBox7.TextDim str3 As String = TextBox9.TextDim str5 As Stringstr5 = str1 & "(" & str2 & "," & str3 & ")" & vbNewLineDim encText As New System.Text.UTF8Encoding()Dim btText() As BytebtText = encText.GetBytes(str5)socketi.Send(btText)Dim s As String = TextBox4.TextTextBox4.AppendText(vbNewLine & str5 & vbNewLine)TextBox4.ScrollToCaret()End Sub'///
'界面关闭时触发Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosedEnding()End SubPrivate Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.ClickTrySend_Timer.Stop()Catch ie As ExceptionEnd TryEnd Sub

界面:

源代码地址:https://github.com/fengasdf/WindowsApplication2

用vb.net开发的简易(通用)上位机相关推荐

  1. 基于canoe开发的Bootloader刷写上位机,符合uds流程

    基于canoe开发的Bootloader刷写上位机,符合uds流程,可供项目应用和学习 另有支持周立功can卡的Bootloader上位机,符合uds规范的支持s32k144,英飞凌的Bootload ...

  2. swd脱机烧录器及上位机源码_通用上位机框架HwLib.Automation(C#)

    概述 现在的工业自动化领域,虽然组态软件因简单易用.价格合理而被广泛部署到各行各业的控制系统上.但对于一部分应用场景来说,自己开发上位机应用程序依然占有不小的市场,诸如: 1.标准化设备厂商,大量的软 ...

  3. Matlab上位机开发(一) —— 了解上位机

    1. 上位机的作用 在嵌入式项目开发中,无论是单片机项目.嵌入式Linux项目.FPGA项目,上位机始终是一个很重要的部分,主要用于: 数据显示(波形.温度等) 用户控制(LED,继电器等) 文件传输 ...

  4. 用python做一个上位机串口通信_【教程】简易Python上位机之LED控制

    电子爱好者应该不会对"上位机"这个词感到陌生,毕竟或多或少有过接触.但若是说到上位机的开发的话,大家就不一定熟悉了.很多电子爱好者完全没有接触过上位机的开发工作,他们真的没有相应的 ...

  5. python led屏控制_【教程】简易Python上位机之LED控制

    电子爱好者应该不会对"上位机"这个词感到陌生,毕竟或多或少有过接触.但若是说到上位机的开发的话,大家就不一定熟悉了.很多电子爱好者完全没有接触过上位机的开发工作,他们真的没有相应的 ...

  6. 正点原子Linux开发板——Qt串口上位机实验

    前言: 最近在学习嵌入式qt开发,然后跟着教程编写了一个简单的串口上位机程序,在编写的时候还算比较顺利,但在调试的时候花了点功夫,折腾了一下午.最后还是理清了思路,解决了问题,特写此博客进行记录和总结 ...

  7. 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭

    https://www.cnblogs.com/yangfengwu/p/11087618.html 其实这一节就是对上三节的综合测试 https://www.cnblogs.com/yangfeng ...

  8. 【北醒通用上位机】TF系列测试使用说明

    目录 硬件准备 2:连接设备 3:上位机连接以及读数 ps:使用环境及注意事项 常见问题 1 Dist可以看到距离值,但是曲线图界面无图形 ![在这里插入图片描述](https://img-blog. ...

  9. 基于python的智能小车_Python开发智能移动小车平台上位机

    智能移动小车平台上位机界面设计告一段落,特此记录一下整体的框架,以免之后再用的时候回忆不起来. 一.地图获取路径数据: 1.首先通过奥维地图绘制从起点到终点的多条路径,然后根据最优路径选择算法(此处选 ...

最新文章

  1. Ubuntu20.4安装及配置mysql详细教程
  2. 第一个helloworld.c实例
  3. 第4.3节 Python中与迭代相关的函数
  4. Android之Base64
  5. boa + ajax + cgi ajax请求cgi
  6. c++ 使用nacos_想自学Maven?推荐Maven极简高速入门及常规使用
  7. lnmp mysql 自动关闭_mysql总是自动停止 日志提示Plugin ‘FEDERATED’ is disabled的解决办法...
  8. JavaWeb 基于jsp+javabean+servlet+mongodb 增删改查
  9. 少了unicon-tools是不行滴
  10. Spring boot restful api 方法参数 BindException 异常处理
  11. Matlab编程与C编程的不同
  12. 安装sphinx的心得和错误处理
  13. 选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...
  14. linux在线语音播报功能
  15. win10声音控制面板扬声器默认设备显示未插入扬声器
  16. win10系统鼠标右键一直转圈的两种解决方法
  17. 程序员如何提高自己的能力
  18. java 设置字符串编码_Java字符编码设置总结
  19. (二)51单片机基础——LED
  20. 程序员自我提升的5个方法

热门文章

  1. 数据埋点、公司SOP流程
  2. 2020-11-17最小转弯半径计算
  3. 计算机专业python毕业设计题目_计算机科学与技术专业毕业论文参考题目
  4. 小技巧 - 解决 webp 格式图片的快速复制粘贴
  5. Windows使用VMware 安装macOS虚拟机
  6. 如何解决visual studio提示使用_CRT_SECURE_NO_WARNINGS的问题
  7. 【Matlab 六自由度机器人】基于蒙特卡罗方法(Monte Carlo Method)构建机器人工作空间(附MATLAB建模仿真完整代码)
  8. python 实现计时器(不同实现方式)
  9. vue3使用vite+setup+ts写一个初级前端项目
  10. 英特尔凌动处理器_英特尔Daniel Rodriguez:驾驭2020云网融合浪潮 | 5G on IA