110,566
社区成员
发帖
与我相关
我的任务
分享
public class Buffer
{
const int Size =4096;//缓存大小
byte[] buffer = new byte[Size];
int InPtr = 0; //当前数据入缓存的起始位置
int OutPtr = 0; //当前缓存取数据起始位置(也就是未处理的数据起始位置)
int dataLength = 0; //当前缓存中数据长度
int dataSpace = Size; //当前缓存还可存入的数据
public void DataIn(byte[] data)
{
if (data.Length <= dataSpace)
{
for (int i = 0; i < data.Length; i++)
{
buffer[InPtr] = data[i];
}
InPtr = (InPtr + data.Length) % Size;
dataLength = (dataLength + data.Length);
dataSpace = dataSpace - data.Length;
}
}
public byte[] DataOut(int Length)
{
if (Length <= dataLength && Length>0)
{
byte[] data = new byte[Length];
for (int i = 0; i < Length; i++)
{
data[i] = buffer[(OutPtr + i) % Size];
}
OutPtr = (OutPtr + Length) % Size;
dataLength = (dataLength -Length);
dataSpace = dataSpace+Length;
}
}
}
我把缓存类的大体结构代码给你,我自己的是泛型,并且有些乱七八糟的事件等之类,你这里没有必要,只需处理字节串
bool RequestStop = false;
int L = 10;
void Process()
{
while (!RequestStop)
{
while (buffer.dataLength > 0)
{
byte[] data = buffer.DataOut(L );
DoWork(data);//处理数据,并做想要做的事情!!
}
}
}
这样一来,你串口的接收是没有问题了,因为串口的接收不会“卡”,但是这样会有另外一个问题,那就是在这个线程里面如果操作主界面的文本框呢?
对,你很聪敏,你可以用委托,也就是你自己最上面串口接收那块处理的代码块!
当然还有另外一个思路:事件委托,利用事件参数传递数据,这,不属于这个范围了。楼上兄弟说的很对..
嘿嘿,这个问题正好是我之前所遇到的。你应该清空缓冲区,再读取。你还可以在接收的时候,进行校验。这样就可以避免错误。