저는 C#에서 데이터 로깅 응용 프로그램을 만들었습니다. SerialPort 클래스가있는 4 개의 USB 센서에 연결됩니다. 모든 바이트에서 데이터 수신 이벤트 임계 값을 트리거했습니다. 데이터가 수신되면 프로그램은 해당 바이트가 라인의 끝인지 여부를 확인합니다. 그렇지 않은 경우 입력이 버퍼에 추가됩니다. 행 끝인 경우 프로그램은 시간 소인을 추가하고 데이터와 시간 소인을 파일에 씁니다 (각 입력 소스는 전용 파일을 가져옵니다).복수의 SerialPort가 실시간으로 반환됩니다.
하나 이상의 COM 포트 입력을 사용할 때 문제가 발생합니다. 내가 출력 파일에서 볼 것은 :
4 파일의 모든 :
...
timestamp1 value1
timestamp2 value2
timestamp3 value3
value4
value5
value6
timestamp7 value7
...
그래서, 그것이 무엇처럼 보이는 것은 컴퓨터가 다음 값 전에 4 개 인터럽트에 도착하는 빠른 것만으로는 충분하지 않습니다이다 태어나다.
...
timestamp value
timestamp value
value
val
timestamp ue
timestamp value
...
그것은 수 있습니다 때문에 난 단지 코어 2. 내가 한 실행하는 프로세서 선호도를 변경한다는 사실에 : 나는 가끔이 같은 출력을 볼 수 있기 때문에이 범인이라고 생각하는 이유가 이것은 내가 사용하고있는 타임 스탬프가 프로세서 사이클 수로 계산되기 때문에 어떤 코어가 실행 중인지에 따라 여러 시간 참조를 가질 수 없습니다. 아래에 코드 스 니펫 중 일부를 넣었습니다. 누락 된 타임 스탬프를 도울 수있는 제안 사항은 크게 감사하겠습니다!
public mainLoggerIO()
{
//bind to one cpu
Process proc = Process.GetCurrentProcess();
long AffinityMask = (long)proc.ProcessorAffinity;
AffinityMask &= 0x0002; //use only the 2nd processor
proc.ProcessorAffinity = (IntPtr)AffinityMask;
//prevent any other threads from using core 2
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
Thread.CurrentThread.Priority = ThreadPriority.Highest;
long frequency = Stopwatch.Frequency;
Console.WriteLine(" Timer frequency in ticks per second = {0}",
frequency);
long nanosecPerTick = (1000L * 1000L * 1000L)/frequency;
Console.WriteLine(" Timer is accurate within {0} nanoseconds",
nanosecPerTick);
if (Stopwatch.IsHighResolution)
MessageBox.Show("High Resolution Timer Available");
else
MessageBox.Show("No High Resolution Timer Available on this Machine");
InitializeComponent();
}
등등. 임)
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//serialPort1.DataReceived = serialPort1_DataReceived;
rawPort1Data = "";
rawPort1Data = serialPort1.ReadExisting();
this.Invoke((MethodInvoker)delegate { returnTextPort1(); });
}
메소드 returnTextPort 번호 (: 각 데이터 귀환 인터럽트는 다음과 같다
private void returnTextPort1()
{
if (string.Compare(saveFileName, "") == 0)//no savefile specified
return;
bufferedString += rawPort1Data;
if(bufferedString.Contains('\r')){
long timeStamp = DateTime.Now.Ticks;
textBox2.AppendText(nicknames[0] + " " + timeStamp/10000 + ", " + rawPort1Data);
//write to file
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@saveFileName, true))
{
file.WriteLine(nicknames[0] + " " + timeStamp/10000 + ", " + rawPort1Data);//in Ms
}
bufferedString = "";
}
}
사용중인 용어에주의하십시오. 프로그래밍에서 COM은 직렬 포트와 완전히 다른 것입니다. –
사실입니다. 직렬 통신을 의미하므로 COM을 의미했습니다. –
저는 Ghz 범위에서 작동하는 직렬 포트를 아직 보지 못했습니다. 그래서 PC가 입력보다 느릴지 의심 스럽습니다.모든 이벤트가 동일한 스레드 (주 스레드)에서 트리거되어 데이터 블리딩으로 나타날 수있는 식별 가능한 이벤트가 발생할 가능성이 큽니다. 다른 스레드 또는 자식 프로세스로 처리 부하를 줄이면 COM 활동을 분리 할 수 있습니까? –