private void COM_Port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte bt = (byte)COM_Port.ReadByte();
if (bt == 0x5c)
b = true;
if (b == true)
{
if (j >= 288)
{
b = false;
Thread trd = new Thread(new ThreadStart(this.Recve));
trd.IsBackground = true;
trd.Start();
}
else
{
Recv_Buff[j] = bt;
j++;
}
}
}中断中这么写的,但是读288个字节居然用了7,8秒,肯定不正常,求教怎么优化?
{
byte bt = (byte)COM_Port.ReadByte();
if (bt == 0x5c)
b = true;
if (b == true)
{
if (j >= 288)
{
b = false;
Thread trd = new Thread(new ThreadStart(this.Recve));
trd.IsBackground = true;
trd.Start();
}
else
{
Recv_Buff[j] = bt;
j++;
}
}
}中断中这么写的,但是读288个字节居然用了7,8秒,肯定不正常,求教怎么优化?
何必一次读一个,缓冲区有多少就读多少白int nByteNum = serialPort1.BytesToRead;
byte[] arraybyte = new byte[nByteNum];
serialPort1.Read(arraybyte, 0, nByteNum);
j是int型变量,是个计数器要它的长度没用
private void COM_Port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{thread.sleep(500); //从激活事件开始,等待缓冲区填充,可加大填充率,一般测试都可以填满缓冲区。 不加这个你确实读取的数量不确定。因为激活事件激活条件就不确定。int nByteNum = serialPort1.BytesToRead;
byte[] arraybyte = new byte[nByteNum];
serialPort1.Read(arraybyte, 0, nByteNum); 、
}表象其实不是丢数据,是因为事件激活时,缓冲区数据没有填写多少,比如server 发了5个,client 收了2个就激活了事件。 你就读到了2个。
thread.sleep() 可以逐渐加到到人家发多少,你收多少的地步。 不信你可以测试一下
{
b = false;
Thread trd = new Thread(new ThreadStart(this.Recve));
trd.IsBackground = true;
trd.Start();
}
else
{
Recv_Buff[j] = bt;
j++;
}我发现问题到哪了,你那个线程只开始了,根本就没关闭,这样就算你关闭了窗口,但是在系统进程里它还是有个进程,有点类似死循环了...
串口怎么能堵死? thread.sleep(500); 这500 毫秒里,串口一直在接收数据并填充接收缓冲区。
只是延迟你接收处理, 跟阻塞谈不上关系。
假设你觉得500毫秒界面会卡。 这倒是有可能。 可以用 backgroundwork 里,control.invoke 刷新界面好了。你根本犯不着一次处理一个字节。 我的思路是一次处理整个缓冲区的数据。