c#SerialPort读取了接收缓冲里的值后还在吗?缓存里还有值吗
2个回答
展开全部
所谓的缓冲区其实就是一系列的byte[]内存单元。
byte[] buffer = new byte[100];
//此时buffer中所有单元全是0.
int s = accept(buffer);、
假定s = 100;
则100人byte都是接收回来的值。
读取之后就buffer并没有发生变化。
s = accept(buffer);
假定s=50;
则前50个是新接收的数据。后50个是上次接收100个byte时的后50个数据,你取值的时间,只取前50个,否则你会取到后50个上次的数据。也就是说accept等写缓冲时,并没有将buffer进行清除,而是直接覆盖。所以还可以看到后50个的值。
但是SerialPort只是一个串口通信,与你所设定的缓冲区没有任何关系。所以读无还可以再读的。因为读缓冲区并没有清除缓冲区。
但有时,串口通信我们多采用双线程,写缓冲区与读缓部区各是一个线程。利用生产者——消费者模式,写完后,写线程被阻塞,只能去读,无法再实现写了。而读线程读完一程也被阻塞,只能等待写完后才能重新进读线程。
也就是说如果你自己采用了这种模块,无法在读两次的(线程阻塞了),但是如果不晕种模式,则本身是可以再次读到内容的——至于写线程是否正在写或写了一部分,那么你读的内容会有不中预知的变化的。所以才设计生产者与消费者模式。
但缓存区中是否有内容,与模式没有关系的。
byte[] buffer = new byte[100];
//此时buffer中所有单元全是0.
int s = accept(buffer);、
假定s = 100;
则100人byte都是接收回来的值。
读取之后就buffer并没有发生变化。
s = accept(buffer);
假定s=50;
则前50个是新接收的数据。后50个是上次接收100个byte时的后50个数据,你取值的时间,只取前50个,否则你会取到后50个上次的数据。也就是说accept等写缓冲时,并没有将buffer进行清除,而是直接覆盖。所以还可以看到后50个的值。
但是SerialPort只是一个串口通信,与你所设定的缓冲区没有任何关系。所以读无还可以再读的。因为读缓冲区并没有清除缓冲区。
但有时,串口通信我们多采用双线程,写缓冲区与读缓部区各是一个线程。利用生产者——消费者模式,写完后,写线程被阻塞,只能去读,无法再实现写了。而读线程读完一程也被阻塞,只能等待写完后才能重新进读线程。
也就是说如果你自己采用了这种模块,无法在读两次的(线程阻塞了),但是如果不晕种模式,则本身是可以再次读到内容的——至于写线程是否正在写或写了一部分,那么你读的内容会有不中预知的变化的。所以才设计生产者与消费者模式。
但缓存区中是否有内容,与模式没有关系的。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询