111,120
社区成员
发帖
与我相关
我的任务
分享
非常感谢~~~~~~~~~
还有个疑惑①这样放在缓冲区是不是效率也比较低(还没有实验,下位机被人拿走了。。),因为传输的比特率比较大115200;②用一个timer控件可以不?(线程不太会);③串口的缓冲区size最大4096吗?[/quote]
1、这个缓存的大小由你设定!根据实际情况,你可以把缓存大小设为100字节或更小。
2、效率低在那个地方?我不明白你问的!!建立一个线程,监听这个缓存,缓存的dataLength>0,即处理,基本上,缓存中一有数据进入,该线程就取出数据进行处理。
没必要用TIMER,好吧,我把代码都放上来,你把分给我吧[/quote]效率低,是一次接收字节比较多(4000多吧)的时候,用DataIn()方法接收会不会要时间很多,这样又会出现数据丢失吧[/quote]
无语,一次接收4000多?你触发门限设为1,有数据一来,就会接收!!!!再多的字节,也是分若干次接收,好不?串口自己也是有缓存的!!
比如,上位机一下子发10000字节,这10000个字节也是一个个字节来到下位机的好么?下位机一发现到来数据到达接收门限,即触发读串口缓存数据。这个DataIn你可以优化,但对于你这样的串口数据量,完全没压力好么?
我已经说了网络的每秒14000字节数据,它都没问题好不?
别跟我扯犊子了,你有疑问很好,BUT,你先明白我说的,然后去尝试后,再发言好么?如果到现在你还不明白按我这思路怎么做,我只能无语。
学习,不是你这样的,上面那么多人提出缓存的解决思路,你有听进去?
你的分数,我也不要了,你慢慢慢慢琢磨了,我懒得回复了!
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);//处理数据,并做想要做的事情!!
}
}
}
这样一来,你串口的接收是没有问题了,因为串口的接收不会“卡”,但是这样会有另外一个问题,那就是在这个线程里面如果操作主界面的文本框呢?
对,你很聪敏,你可以用委托,也就是你自己最上面串口接收那块处理的代码块!
当然还有另外一个思路:事件委托,利用事件参数传递数据,这,不属于这个范围了。
非常感谢~~~~~~~~~
还有个疑惑①这样放在缓冲区是不是效率也比较低(还没有实验,下位机被人拿走了。。),因为传输的比特率比较大115200;②用一个timer控件可以不?(线程不太会);③串口的缓冲区size最大4096吗?[/quote]
1、这个缓存的大小由你设定!根据实际情况,你可以把缓存大小设为100字节或更小。
2、效率低在那个地方?我不明白你问的!!建立一个线程,监听这个缓存,缓存的dataLength>0,即处理,基本上,缓存中一有数据进入,该线程就取出数据进行处理。
没必要用TIMER,好吧,我把代码都放上来,你把分给我吧[/quote]效率低,是一次接收字节比较多(4000多吧)的时候,用DataIn()方法接收会不会要时间很多,这样又会出现数据丢失吧
非常感谢~~~~~~~~~
还有个疑惑①这样放在缓冲区是不是效率也比较低(还没有实验,下位机被人拿走了。。),因为传输的比特率比较大115200;②用一个timer控件可以不?(线程不太会);③串口的缓冲区size最大4096吗?[/quote]
1、这个缓存的大小由你设定!根据实际情况,你可以把缓存大小设为100字节或更小。
2、效率低在那个地方?我不明白你问的!!建立一个线程,监听这个缓存,缓存的dataLength>0,即处理,基本上,缓存中一有数据进入,该线程就取出数据进行处理。
没必要用TIMER,好吧,我把代码都放上来,你把分给我吧
看见最近好多人在问串口的问题,加分到100,希望大拿们帮下我们这些菜鸟
非常感谢~~~~~~~~~
还有个疑惑①这样放在缓冲区是不是效率也比较低(还没有实验,下位机被人拿走了。。),因为传输的比特率比较大115200;②用一个timer控件可以不?(线程不太会);③串口的缓冲区size最大4096吗?
求缓存代码~~楼上兄弟说的很对..

嘿嘿,这个问题正好是我之前所遇到的。你应该清空缓冲区,再读取。你还可以在接收的时候,进行校验。这样就可以避免错误。