unity | 串口的理解和程序应用

目录

一、串口的理解

二、常见名词(TTL、RS232、RS485、RS422)

三、串口和十六进制的关系

四、收发串口的插件SerialPortUtilityPro

五、使用SerialPortUtilityPro收发信息

六、发送和接收信息的代码

七、把接收信息的代码挂到组件上


一、串口的理解

串口,全称(串行通讯端口),英文名(cluster communication port),英文简称(COM口)。

首先需要知道的是:

串口是一个硬件(如图1所示)

图1 串口硬件

叫串行通讯端口的原因是:

我们在程序里发送时,一般发送的是byte数组,这个数组是一起发出去的,但肯定前面和后面的数会有一点点时间差,串口就把这个一起收到的byte数组,拆成一个一个,按时间一个一个的发送出去。

二、常见名词(TTL、RS232、RS485、RS422)

这几个东西可以理解为电信号,用电流来区分信息。

硬件一般就是和机器进行互动,我们经常说,机器只能看懂0和1两个信号,所以,我们需要想办法把信号分成0和1两个。

区分方法是通过控制电压不同:

TTL:

电压高于2.7V就认为是1;

电压小于0.5V就认为是0;

RS232:

输入时:电压在-3~-15V就认为1;电压在+3~+15V就认为是0;

输出时:电压在-5~-15 V就认为1;电压在+5~+15 V就认为是0;

由于接口的电压常用在5V左右,所以非常常见的电信号就是RS232;

RS485:

这个接的是两条线,第一条称作A,第二条称作B

输入时:A比B高200mV以上就认为1,低200mV以上就认为0;

输出时:2<A-B<6就认为是1,-6<A-B<-2就认为是0;

所以这几个词只是由于电压不同,选择了不同的串口。

USB和串口不是一个东西,所以如果连了USB口,那就是有硬件把信号从USB转到了我们用的串口上。

三、串口和十六进制的关系

曾今我们发信息就是:000110101010,这样就很容易弄错,多发个1,少发个0,都看不出来,你也不知道发完没有,后面还有没有,收够了没有,很容易搞错。

所以他们想,把每次发的个数都定下来,不够的用0补上,这样就不容易错。

例,如果定下来,一次必须发8个数,那么我想发个1,就必须发0000 0001。

想来想去,那就发16进制吧,因为一个16进制转换成2进制,刚好就是8个数,这样大家都约定好,每次只发8个数,那边就每次只接8个数,这样大家好核对,不容易出错。

提示0x,不是发的信息,只是一个注释,表示后面的数是16进制,而不是别的。

串口协议中,开始会先让发个0x55,或者0xaa,因为55转换成2进制为01010101,aa转换成2进制为10101010,这两个因为都是1和0错开的,所以不容易搞错,然后通过接收到0和1的间隔,能算出来传播的速度(波特率),这样可以初步判断后面应该以什么速度接收,和猜出(算出)波特率。

波特率的意思:

1秒传几个bit,9600就是1秒钟传9600个bit

一个byte是8个bit,所以一秒可以传1200byte,

通俗点说,就是,一秒可以传1200个0或1。

四、收发串口的插件SerialPortUtilityPro

可以在网上自行下载

五、使用SerialPortUtilityPro收发信息

这个插件里带了一个组件,叫SerialPortUtilityPro

新建一个空物体→addComponent→SerialPortUtilityPro(如图2所示)

图2 SerialPortUtilityPro

空物体上就会出现这个组件,这个组件就是用来收发串口信息的。

如果只有一个串口,希望发16进制的信息,设置如下。(如图3所示)

图3 SerialPortUtilityPro设置

六、发送和接收信息的代码

	public SerialPortUtilityPro sp;
	public string cmd;
	public Button button;
    private void Start()
    {
		//当点击按钮的时候,就发送一个string信息
		button.onClick.AddListener(()=>
		{
			//把信息转换成16进制
			SendHexData(cmd);
		});

	}
    public void SendHexData(string msg)
	{
		sp.Write(HexStringToData(msg));
	}

	//如果接收到信息,转换成string
	public void ReadStreamingBinary(object data)
	{
		var bin = data as byte[];
		string byteArray = System.BitConverter.ToString(bin);
		ConvertData(byteArray);
	}
	private void ConvertData(string byteArray)
	{
		Debug.Log(byteArray);
	}

	//把string转换成16进制信息
	private byte[] HexStringToData(string text)
	{
		string[] hexValuesSplit = text.Split(' ');
		byte[] retData = new byte[hexValuesSplit.Length];
		int inum = 0;
		foreach (string hex in hexValuesSplit)
		{
			try
			{
				// Convert the number expressed in base-16 to an integer.
				retData[inum] = System.Convert.ToByte(hex, 16);
				++inum;
			}
			catch (System.FormatException)
			{
				//ignore
			}
		}

		return retData;
	}

七、把接收信息的代码挂到组件上

(如图4所示)

图4 接受信息的方法

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菌菌巧乐兹

希望能给大家写更多有用的文章~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值