今天的重点有以下几点
1.比如有1-16个按钮 ,每个对应一个继电器的16个开关和Windows电脑里面程序16个视频
点击一个按钮,继电器打开一个,其余都关闭。Windows程序切换一个视频
1.问题:不能一个按钮写一个命令,对应一个继电器的开关和Windows的视频吧,如果有100个呢?不得死?后期修改维护呢?
1.解决办法,搞个for循环。没错,是这样的,但是新问题出来了
2.新问题:(Windows程序就不说了,你固定好1-16发送string即可)继电器不一样啊,继电器要接收16位的16进制的数字
2.首先分析16位的16进制的数字
2.1. 以这个为例子550113000000016A,这个是打开继电器1号开关,其余都关闭
2.2继续分解550113000000016A,
红色部分为固定的,看继电器说明书即可,每个不一样。
绿色部分为1-16继电器的开关(注意了:0001,是一号开关,0002是二号开关,但是0003,不是3号开关。3号开关为0004。4号开关为0008。12号开关为0800)
怎么得来呢??看截图
绿色部分("6A")为和校验结果(HEX),为什么要有这个,因为要判断前面的12位数字是不是正确(乌龟的屁股,规定)
//和校验结果代码
private string hexStrToByte(string data) {
int sum = 0;
for(int i = 0;i < data.Length / 2;i++) {
string hexStr = data.Substring(i * 2,2);
sum += Convert.ToInt32(hexStr,16);
}
//ToUpper 大写//ToLower 小写
return Convert.ToString(sum,16).ToUpper();
}
完整代码
using System;
using UnityEngine;
public class ClientTool:MonoBehaviour {
public GameObject allBtn;
void Start() {
for(int i = 0;i < allBtn.transform.childCount;i++) {
GameObject obj = allBtn.transform.GetChild(i).gameObject;
EventTriggerListener.Get(obj).onClick = onClick;
}
}
void onClick(GameObject sender) {
UDPClient.instance.Send(sender.name); //发送给Windows的命令
for(int i = 0;i < allBtn.transform.childCount;i++) {
GameObject obj = allBtn.transform.GetChild(i).gameObject;
if(sender.name == obj.name) {
getStrTo16(i);
}
}
}
//开关,比如继电器上有12个开关
//111111111111:表示全开;
//000000000000表示全关;
//100000000001表示第十二个和第一个开关打开,其余的全部关闭
//获取16位字串符
void getStrTo16(int num) {
string str = "";
for(int i = 16;i > 0;i--) {
if(i == num) {
str += "1";
} else {
str += "0";
}
}
Two_16(str);
}
//二进制转换16进制
void Two_16(string args) {
// print(Convert.ToInt32(args, 2));:
//print(Convert.ToInt32(args, 2).ToString("X4"));
//重点:取后四位16进制的字符
string s1 = Convert.ToInt32(args,2).ToString("X4");
//这里的s2是字串符,而不是所谓的16进制数字,
//s1是点击的哪个按钮,或者说是操作的哪个继电器的串口
//"5501130000"是固定的开关命令
string s2 = "5501130000" + s1;
//hexStrToByte(s2) 16位进制和校验结果(HEX)------也就是s2的校验
string send_ChuanKou = s2 + hexStrToByte(s2);
//发送给继电器的送命令,所有的工作都是为了这一步
//有时候同时发送,只能接收一个,可以协成 yield return new WaitForSeconds(0.01f);,间隔一下
UDPClient.instance.SendHEX(send_ChuanKou);
}
/// <summary>
/// //要把这一串字符“55011300112233”转换为8个 数字 55 01 13 00 11 22 33,并且这八个数字是16进制的
/// </summary>
private string hexStrToByte(string data) {
int sum = 0;
for(int i = 0;i < data.Length / 2;i++) {
string hexStr = data.Substring(i * 2,2);
sum += Convert.ToInt32(hexStr,16);
}
//ToUpper 大写//ToLower 小写
return Convert.ToString(sum,16).ToUpper();
}
}