C#网口数据处理-环形缓冲区
在C#中用环形数据缓冲区对网口数据进行处理
·
1、环形缓冲区
环形缓冲区并不是物理意义上一个首尾相连的环形缓冲区,而是逻辑意义的一个环,是一个先进先出,有一定长度的内存空间,具备对缓冲区的互斥访问功能。
2、程序实现
环形缓冲区通常有一个读指针、一个写指针、一个数据长度、一段内存空间(可以是数组、也可以是链表)
public class RingBuffer
{
private int readPoint;
private int writePoint;
public int Count { get; set; }
public byte[] BufferData { get; set; }
public RingBuffer(int size)
{
readPoint = 0;
writePoint = 0;
Count = 0;
BufferData = new byte[size];
}
//写数据
public int Write(byte[] data)
{
if (writePoint + data.Length > BufferData.Length)
{
int writePointBackup = 0;
if (writePoint == BufferData.Length)
{
writePoint = 0;
Buffer.BlockCopy(data, 0, BufferData, writePoint, data.Length);
writePoint += data.Length;
}
else
{
int len = BufferData.Length - writePoint;
Buffer.BlockCopy(data, 0, BufferData, writePoint, len);
Buffer.BlockCopy(data, len, BufferData, 0, data.Length - len);
writePointBackup = writePoint;
writePoint = data.Length - len;
}
Count += data.Length;
if (Count > BufferData.Length)
{
if (writePoint > readPoint)
{
Count = writePoint - readPoint;
readPoint = writePointBackup;
}
else
{
Count = readPoint - writePoint;
}
}
}
else
{
Buffer.BlockCopy(data, 0, BufferData, writePoint, data.Length);
writePoint += data.Length;
Count += data.Length;
}
return Count;
}
//读数据
public byte[] Read(int num)
{
byte[] data = new byte[num];
if (num > Count)
{
return null;
}
if (readPoint + num > BufferData.Length)
{
if(readPoint== BufferData.Length)
{
readPoint = 0;
Buffer.BlockCopy(BufferData, readPoint, data, 0, num);
readPoint += num;
}
else
{
int len = BufferData.Length - writePoint;
Buffer.BlockCopy(BufferData, readPoint, data, 0, len);
Buffer.BlockCopy(BufferData, 0, data, len, num - len);
readPoint = num - len;
}
}
else
{
Buffer.BlockCopy(BufferData, readPoint, data, 0, num);
readPoint += num;
}
Count -= num;
return data;
}
}
3、软件调用
try
{
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//把ip和端口转为IPEndpoint实例
int port = Convert.ToInt32(textBox2.Text);
IPAddress ip = IPAddress.Parse(textBox1.Text);
IPEndPoint ipe = new IPEndPoint(ip, port);
//创建socket 并连接到服务器
c.Connect(ipe);
button1.Text = "断 开";
button1.Image = TCPClient.Properties.Resources.bitmap2;
thread = new Thread(new ThreadStart(TCPlisten));
thread.IsBackground = true;//指示该线程为后台线程。后台线程将会随着主线程的退出而退出。
thread.Start();
}
catch (Exception ex)
{
MessageBox.Show("连接到服务器失败");
}
private void TCPlisten()
{
while (true)
{
try
{
Encoding my = Encoding.GetEncoding("GB2312");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);
if (bytes > 0)
{
byte[] data = new byte[bytes];
Buffer.BlockCopy(recvBytes, 0, data, 0, bytes);
ringBuffer.Write(data);
}
recvStr += my.GetString(recvBytes, 0, bytes);
TextReceive.Invoke
(
new MethodInvoker
(
delegate
{
TextReceive.Text += recvStr;
rlength = rlength + recvStr.Length;
textBox6.Text = rlength.ToString();
}
)
);
}
catch
{
MessageBox.Show("请连接服务器");
continue;
}
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)