当前位置: 首页 > news >正文

上位机状态机开发之连接机械手

上位机状态机开发之连接机械手

1 连接机械手

/// <summary>/// 连接机械手/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidmaterialButton1_Click(objectsender,EventArgse){// 连接机械手服务端if(CommunicateService.Instance.ConnectServer()){lb_status.Text="已连接";lb_status.BackColor=Color.Green;}else{lb_status.Text="连接失败";lb_status.BackColor=Color.Red;}}

2.CommunicateService

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Net.Http;usingSystem.Text;usingSystem.Threading.Tasks;namespace上位机程序{publicclassCommunicateService{//单例模式://1. 私有静态变量(在第四步供外界使用),创建类的实例//2. 私有构造函数,确保外部无法直接实例化(确保是单个实例)//3. 确定供外界调用的代码资源//4. 公开静态属性,供外界使用(把第一步类的实例,开放出去)//5. 外界使用//1. 私有静态变量(在第四步供外界使用),创建类的实例privatestaticCommunicateServiceinstance=newCommunicateService();//2. 私有构造函数,确保外部无法直接实例化(确保是单个实例)privateCommunicateService(){}//4. 公开静态属性,供外界使用(把第一步类的实例,开放出去)publicstaticCommunicateServiceInstance{get{returninstance;}}//3. 确定供外界调用的代码资源HttpClienthttpClient=newHttpClient("192.168.1.109",5001);HttpClienthttpClient2=newHttpClient("127.0.0.1",8080);HttpClienthttpClient3=newHttpClient("127.0.0.1",7930);/// <summary>/// 连接服务端/// </summary>/// <returns></returns>publicboolConnectServer(){if(httpClient.Connect()){returntrue;}returnfalse;}publicboolConnectServer2(){if(httpClient2.Connect()){returntrue;}returnfalse;}publicboolConnectServer3(){if(httpClient3.Connect()){returntrue;}returnfalse;}/// <summary>/// 发送消息/// </summary>/// <param name="Content"></param>publicvoidSend2(stringContent){httpClient2.SendMsg(Content);}/// <summary>/// 发送消息/// </summary>/// <param name="Content"></param>publicvoidSend(stringContent){httpClient.SendMsg(Content);}/// <summary>/// 发送消息/// </summary>/// <param name="Content"></param>publicvoidSend3(stringContent){httpClient3.SendMsg(Content);}}}

3.HttpClient

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace上位机程序{publicclassHttpClient{// 1:创建通信套接字。publicSocketSocketClient;#region属性/// <summary>////// </summary>publicstringIp{get;set;}="127.0.0.1";/// <summary>/// 端口/// </summary>publicintPort{get;set;}=8080;#endregion/// <summary>/// 构造器(对IP和端口进行赋值)/// </summary>publicHttpClient(stringip,intport){Ip=ip;Port=port;}/// <summary>/// 连接服务端/// </summary>publicboolConnect(){// 1:创建通信套接字。(确定为因特网,流式数据,tcp通讯)SocketClient=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);// 2.设置服务器的IP和端口号。(this,表示当前窗口,可以不加,加了更安全)IPEndPointip_port=newIPEndPoint(IPAddress.Parse(Ip),Port);// 3. 连接try{SocketClient.Connect(ip_port);}catch(Exceptionex){MessageBox.Show("连接服务器失败:"+ex.Message);returnfalse;}// 5:接受数据。//创建一个一直运行的监听的线程Task.Run(newAction(()=>{ReceiveMsg();}));returntrue;}/// <summary>/// 以utf-8接受数据/// </summary>privatevoidReceiveMsg(){while(true){try{// 创建一个缓冲区byte[]buffer=newbyte[1024*1024*10];// 数据长度intlength=-1;// 第四步:调用读写函数发送或者接收数据。try{// 接受数据length=SocketClient.Receive(buffer);}catch(Exception){break;}// 如果数据大于0,则解析if(length>0){stringmsg=string.Empty;msg=Encoding.UTF8.GetString(buffer,0,length);// 如果收到机械手执行结束命令,就将结束标志位设为1if(msg.Contains("Finish")){GlobalParameters.FinishFlag=1;}elseif(msg.Contains("OK")){GlobalParameters.SnapImageFlag=1;GlobalParameters.SnapImageFlag2=1;}elseif(msg.Contains("NG")){GlobalParameters.SnapImageFlag=2;GlobalParameters.SnapImageFlag2=2;}elseif(msg.Contains("Move")){string[]xy=msg.Split(',');GlobalParameters.X=Convert.ToDouble(xy[1]);GlobalParameters.Y=Convert.ToDouble(xy[2]);}// 报错,因为跨线程,跨UI// rtb_Receive.AppendText(msg);}}catch(Exceptionex){}}}/// <summary>/// 发送数据utf8/// </summary>/// <param name="sender"></param>/// <param name="e"></param>publicvoidSendMsg(stringContent){stringcontent=Content.Replace("\\n","\n");byte[]sendMsg=Encoding.Default.GetBytes(content);// 发送数据SocketClient?.Send(sendMsg);}}}

4.GlobalParameters

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespace上位机程序{publicclassGlobalParameters{publicstaticintFinishFlag=0;publicstaticintSnapImageFlag=0;publicstaticintSnapImageFlag2=0;// 移动的X坐标publicstaticdoubleX=100;// 移动的Y坐标publicstaticdoubleY=100;}}
http://www.cnnetsun.cn/news/27703.html

相关文章:

  • 三极管:电子信息时代的核心“控制单元”,藏于设备中的关键器件
  • 1小时打造专属右键菜单工具:快马平台实战
  • 零基础用AI制作第一个Macyy风格网页
  • GG3M业务核心:需求满足与问题解决 | GG3M Business Core: Demand Satisfaction and Problem Solving
  • 零基础玩转Vulhub:从安装到第一个漏洞复现
  • AI如何帮你快速解决Unexpected End of File错误
  • 企业级实战:用Vulhub构建内部攻防演练平台
  • 小白也能懂:Maven 3.6.1图文安装指南
  • 2025年Top5软件外包平台实战评测
  • React小白也能懂:useEffect入门图解指南
  • 电商网站遇到Internal Server Error的应急处理方案
  • 基于微信小程序+node.js的校园餐饮系统设计与实现
  • springboot基于vue的大学生公益活动志愿服务系统的设计与实现_nahamqu8
  • 操作系统 李治军 4 设备驱动与文件系统
  • 深度学习入门:图像分类的实战应用
  • kafka
  • 刘洋洋新歌《梁祝之三世约》上线,唱尽轮回绝恋
  • 一个完全本地运行的视频转文字工具:Vid2X
  • Java 开发最容易犯的 10 个错误
  • 用 Reader 建个私人图书馆,加上cpolar随时随地畅快阅读
  • 下一代盲盒系统核心架构解析:JAVA-S1如何打造极致公平与全球化体验
  • LangGraph深度解析:从图基础到人机交互的AI工作流框架实践
  • C++--
  • 算法练习4--数组:长度最小的子数组
  • Spring Cloud Gateway为什么要推出 WebMVC 版本?深度解析两大版本的差异与选型
  • git和github的区别
  • 小白从零开始勇闯人工智能Linux初级篇(MySQL库)
  • Bootstrap 模态框详解
  • MinerU终极安全离线部署指南:完全断网环境解决方案
  • 练题100天——DAY24:罗马数字转整数+环形链表+大小端判断