현재 Iam은 직렬 포트를 계속 읽어야하는 프로젝트에서 작업하고 있습니다. 데이터는 최대 45 분 동안 계속오고 있습니다. 체크섬을 통해 데이터의 유효성을 검사하고 79 바이트의 패킷을 만들어야합니다. 이 후 실시간으로 데이터 (탄도)를 그려야합니다. 이 코드의 문제점은 처음에는 CPU 사용량의 20 % (Pentium 4, 3.0 GHz, 하이퍼 스레딩)를 사용하지만 (시간이 지나면 CPU 사용량이 증가하고 결국에는 60 % .CPU 높은 시간 직렬 포트에 대한 시간 사용
데이터는 전송 속도 115200에서 수신되고 100msec 속도로 연속적으로 전송됩니다.
읽기에 대한 나의 코드를 확인하는 다음과 같이 플로팅는 다음 기능은 라벨의 데이터를 표시하고에 궤적을 그릴
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
header1 = serialPort1.ReadByte();
if (header1 == 0)
header2 = serialPort1.ReadByte();
if ((header1 == 0) && (header2 == 1))//Store the data in an array.
{
for (int i = 0; i < 77; i++)
abudata[i] = serialPort1.ReadByte();
tail = abudata[76];
}
else
{
serialPort1.DiscardInBuffer();
}
checksum = 1;// Calculate the checksum.
for (i = 0; i < 74; i++)
checksum = checksum + (abudata[i]);
checksum1 = (abudata[75] << 8);
checksum1 = checksum1 + (abudata[74]);
if ((checksum == checksum1) && (tail == 4))
this.Invoke(new EventHandler(Display_Results));// Function to display
}
catch (Exception ode)
{
l4[4].BackColor = Color.Red;
}
}
다음 함수는 데이터를 수신하고이를 검증 ... 사진을 정기적으로 높은 CPU 부하를 생성하지 않습니다 그 자체로하여 SerialPort 클래스의 사용하여 해당 상자
private void Display_Results(object s, EventArgs e)
{
head1[0] = header1;
head1[1] = header2;
for (k = 0; k < 77; ++k)
head1[k + 2] = (((int)abudata[k]) & 0x000000ff);
jk = 0;
for (k = 0; k < 36; ++k) //Data packing into 36 bytes
{
num_1[k] = (ulong)((head1[jk + 1]) + (head1[jk] << 8)) & 0x0000ffff;
num_1[k] = (double)num_1[k];
num_2[k] = (double)num_1[k];
jk = jk + 2;
signbit = (int)num_1[k] >> 15;
if (signbit == 1)
{
sgnval = -1;
num_1[k] = num_1[k] - 65535;
num_1[k] = num_1[k] * (-1.0);
}
else
sgnval = 1;
//Converting the data into engineering values
engval[k] = Math.Round(num_1[k] * parammaxval[k] * sgnval/32767.0, 3);
if (k == 14)
{
try
{
curr_x = (pictureBox2.Width/2) + (int)((engval[13] * (pictureBox2.Width))/map_width);
curr_y = (pictureBox2.Height/2) - (int)((engval[14] * (pictureBox2.Height))/map_height);
PointF p1 = new Point(curr_x, curr_y);
if (_gPath != null && _gPath.PointCount > 0)
p1 = _gPath.PathPoints[_gPath.PathPoints.Length - 1];
PointF p2 = new Point(curr_x, curr_y);
_gPath.AddLine(p1, p2);
pictureBox2.Invalidate();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
당신은 "C#을 직렬 포트를"무엇을 의미합니까 ... 나에게 어떻게 시스템을 저하없이 궤적을 그릴 수 있다는이 문제에 대한 솔루션을 제안 할 수 있습니다? C#에는 직렬 포트가 없습니다. –