今天用C#实现了串口通信,基本骨架如下:(网上C++版本的例程更多,但考虑到这是我C#项目的一小部分,所以还是决定用C#实现)
SerialPort com = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
com.Open();
byte[] sndBuf = new byte[2];
sndBuf[0] = 0x20;
com.Write(sndBuf, 0, 1);
byte[] rcvBuf = new byte[26];
com.Read(rcvBuf, 0, 26);
回传的数据,存在一个byte[26]数组中。意义:从机向主机回送20H和所有参数数据(V,A,W,PF,Hz),每个参数占五个字节,共5*5+1=26个字节。
可是这些数据竟然不满足以字节为单位,可恶到要按“位”解析!
对每个5字节参数而言,前4字节表示尾数,后1字节表示阶码。在阶码的1字节中,最高位为数符,次高位为阶符(这两个都是0为正,1为负),低6位为阶码值。
例如:
接受字节次序:21,43,65,87,82(均为16进制表示)
其浮点数为:87654321,82 (82的二进制是1000 0010 ,数符为负,阶符为正,阶码值为2)
则它表示的是 —8.7654321*10^2
好几个繁琐的地方。表现在:拼接时,1位数要补齐为2位;整数部分如果是2位,要除10;阶码要按位解析。