目录
一、串口的理解
串口,全称(串行通讯端口),英文名(cluster communication port),英文简称(COM口)。
首先需要知道的是:
串口是一个硬件(如图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所示)
空物体上就会出现这个组件,这个组件就是用来收发串口信息的。
如果只有一个串口,希望发16进制的信息,设置如下。(如图3所示)
六、发送和接收信息的代码
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所示)