현재 직렬 연결을 통해 통합 서보와 통신하는 응용 프로그램을 작성 중입니다.직렬 포트 데이터 구문 분석의 가장 빠른 멀티 스레딩 방법 C#
모터가 최대 1000 번/초 속도로 위치 데이터를 보냅니다. 내가 얻으려고하는 것은 다시 오는 데이터 (공백, 줄 바꿈 등을 제거하여)를 포맷하고 수신 된 문자열에서 관련 데이터를 추출하기 위해 구문 분석 할 수있게하는 것입니다.
현재 데이터 수신 이벤트 핸들러에서 데이터를 읽고 일련의 string.replace 메소드 호출을 사용하여 형식을 지정하며 버퍼로 작동하는 문자열에 추가합니다. 그런 다음 스레드를 사용하여, 모터에서 한 메시지의 끝을 의미하는 특정 구분 기호 (내 경우 "\ r")를 채운 다음 지속적으로 버퍼를 검사하여 버퍼에서 메시지를 제거하고이를 부자에게 인쇄합니다 텍스트 필드.
이 방법에는 두 가지 문제점이 있습니다. 하나는 모터가 높은 속도로 데이터를 위치시키기 때문에 버퍼가 데이터가 스레드에 의해 처리 될 수있는 것보다 빠르게 채워진다는 것입니다. 따라서 모터에 명령을 보내면 즉시 작동하지만 버퍼의 모든 선행 데이터를 먼저 처리해야하기 때문에 응답이 몇 초 지연됩니다. 둘째, while (true) 구조를 구현하는 메서드를 실행하는 두 개의 스레드를 사용하면 프로세서 사용률이 급격히 올라가고 몇 초 내에 PC의 팬이 최대 상태가됩니다.
더 나은 데이터 처리 방법이 있습니까? 일반적으로
private void parseBuffer()
{
while (true)
{
//obtain lock, parse one message from buffer
lock (this)
{
if (readBuffer.IndexOf("\r") > 0)
{
String t = readBuffer.Substring(0, readBuffer.IndexOf("\r") + 1);
readBuffer = readBuffer.Replace(t, "");
dataReady(this, new CustomEventArgs(t, null));
}
}
}
}
문제점을 발견했습니다. 프로그램이 버퍼의 데이터를 충분히 빠르게 처리 할 수있는 것은 아닙니다. 프로그램이 리치 텍스트 상자에 충분히 빨리 쓸 수 없습니다. 내가 사용하고 있던 코드는'textBox1.text + = myText; '. 콘솔로 인쇄 할 때, 앞서 말했듯이, 프로그램이 데이터를 처리하는 것보다 빠르게 버퍼가 커지면 문제가 없습니다. – isometrik