PDA

View Full Version : سوال: مشکل در دریافت و بافر کردن داده از سریال پورت



حامد فراست
چهارشنبه 16 اردیبهشت 1388, 12:05 عصر
با سلام

من برا ی دریافت داده از سریال پورت از یک صف بعنوان بافر استفاده میکنم .وقتی این صف رو درون سازنده کلاس مقدار دهی میکنم برنامه با تاخیر، داده ها رو به من نشان میده و هر چی زمان بیشتری میگذره این تاخیر بیشتر میشه. اینم کدشه که درون سازنده میگذارمش:


receivedbyte = new Queue(Int16.MaxValue);
این جا داده توسط سریال پورت دریافت و با فر میشه


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int count = serialPort1.BytesToRead;
byte[] receive = new byte[count];
serialPort1.Read(receive, 0, count);

foreach (byte data in receive)
{
receivedbyte.Enqueue(data);
}
try
{
ReceiveFrameThread.Resume();
}
catch { }
}

در این قسمت داده های بافر شده مورد پردازش میشود


void FrameProcess()
{
while (permission)
{
bool stop = false;
byte[] tempX = new byte[7];
try
{

do
{
if (receivedbyte.Count > 7)
{
tempX[0] = (byte)receivedbyte.Dequeue();
}
} while (tempX[0] != 0xfe&&!stop) ;
stop = true;
for (byte i = 1; i <= 6; i++)
{
if (receivedbyte.Count > 0)
tempX[i] = (byte)receivedbyte.Dequeue();

}
if (permission)

ReceiveFrameThread.Suspend();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);

}
}

و در این قسمت هم thread مقدار دهی میشود



void Start()
{
serialPort1.Open();
ReceiveFrameThread = new Thread(new ThreadStart(FrameProcess));
permission = true;
ReceiveFrameThread.Start();

حامد فراست
چهارشنبه 16 اردیبهشت 1388, 12:16 عصر
یک مسله دیگه هم هست و اون اینکه وقتی بافر را در Event زیر که کار دریافت و بافر رو انجام میده مقدار دهی می کنم سرعت اجرا عالی مشه اما Cpu Usageخیلی بالا میره(80%میشه) ممنون مشم راهنمایی کنید

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int count = serialPort1.BytesToRead;
byte[] receive = new byte[count];
serialPort1.Read(receive, 0, count);
بافر رو اینجا مقدار دهی کردم :
receivedbyte = new Queue(Int16.MaxValue);

foreach (byte data in receive)
{
receivedbyte.Enqueue(data);
}
try
{
ReceiveFrameThread.Resume();
}
catch { }
}

حامد فراست
جمعه 18 اردیبهشت 1388, 13:18 عصر
لطفا جواب بدین:ناراحت::گریه:

حامد فراست
شنبه 19 اردیبهشت 1388, 10:48 صبح
ای بابا حالا همه سوادا نم کشید یه دفه

حامد مصافی
شنبه 19 اردیبهشت 1388, 11:20 صبح
کد پست اولتان را به این صورت اصلاح کردم. لطفاً تست کنید.


public delegate void EnqueueCallback(byte message);


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int count = serialPort1.BytesToRead;
byte[] receive = new byte[count];
serialPort1.Read(receive, 0, count);

foreach (byte data in receive)
{
//receivedbyte.Enqueue(data);
receivedbyte.Invoke(new EnqueueCallback(this.EnqueueByte), new object[] { data });
}
try
{
ReceiveFrameThread.Resume();
} catch { }
}



private void EnqueueByte(byte message)
{
receivedbyte.Enqueue(data);
}

حامد فراست
یک شنبه 20 اردیبهشت 1388, 15:39 عصر
با تشکر از راهنماییتون
اما شی receivedbyte دارای متدInvoke نمیباشد.
در ضمن برای چی باید این متد را فراخوانی کنم.؟؟

حامد فراست
سه شنبه 22 اردیبهشت 1388, 10:44 صبح
به نظرتون مشکل سر thread -safe نبودن صف است

حامد فراست
سه شنبه 22 اردیبهشت 1388, 20:38 عصر
ای بابا یکی راهنمایی کنه خوب