手一次发送多个数据给我们的程序,我们自己做的串口调试工具只能每次显示4个16进制数,这明显是程序有问题。
这是如何造成的呢?首先我们可以将程序定位到吸收部分,可能是吸收处理函数出了问题,导致显示数据不太正常。先来看一下我们的吸收程序,由于是数值模式吸收,以是红框内的程序嫌疑最大:
我们打断点来看一下,问题究竟出在哪里。

通过打断点我们创造,程序确实只吸收到了这几个数字。到底是由于什么呢?
吸收程序中,我们利用了 serialPort1.ReadByte();这个函数,意思是吸收一个字节。
而串口吸收事宜利用 serialPort1.DataReceived 进行事宜注册,通过F1查看帮助后创造,DataReceived不担保为每个吸收的字节引发事宜,以是就有可能造成数据丢失。以是我们可以换个思路,利用数组来进行吸收。
byte[] rcvByte = new byte[20]; //新建一个20个字节的数组 serialPort1.Read(rcvByte,0,
rcvByte.Length); //直接按数组的长度来读取缓冲区的数据个数
从运行结果可以看到,我们已经成功地将数据吸收到数组中。到这里实在还有一个问题,如果实际发送的数据大于数组长度,又会造成数据丢失。以是我们可以再加上一段程序,在串口事宜触发后,先判断串口读取缓冲区内的数据个数,然后建立相应个数的数组,这样就实现了不定长度的读取。
int data;
data = serialPort1.BytesToRead;
byte[] rcvByte = new byte[data]; //读取20个字节的数据
serialPort1.Read(rcvByte,
0,rcvByte.Length);
来运行一下看看效果:
从上面的图我们可以看到,当发送端数据个数变革时,吸收的数组长度也发生了变革,基本达到了目的。下面须要做的便是将数组在Textbox中显示出来。
try
{
int data;
data = serialPort1.BytesToRead;
byte[] rcvByte = new byte[data]; //读取20个字节的数据
serialPort1.Read(rcvByte,0,rcvByte.Length);
StringBuilder st = new StringBuilder(); //定义一个可变字符串
for (int i = 0; i < rcvByte.Length; i++) //将字节数组的元素组成字符串
{
st.AppendFormat("{0:x2}" + " ", rcvByte[i]);
}
textBox1.AppendText(st.ToString().ToUpper()); //将字符串显示到文本框中
}
catch
{
this.Close();//关闭当前窗体
}
运行起来看当作果,可以实现了。好了,本日的课程就到这里,下期见!