시리얼 데이터를 이와 같이 대기시간 100을 걸어 1초에 10개 즉 0.1초마다 1개씩 받으려고 했습니다.
그런데 5~10개씩 들쑥날쑥하게 초마다 데이터가 찍힙니다.
혹시 1초에 10개씩 정확하게 찍을 수 있는 방법이 있을까요?
전체 코드를 확인해 봐야 합니다.
통신 코드가 들어가 있는 루프에 다른 코드가 추가되어 있으면 지연의 원인이 됩니다.
큐를 이용해서 데이터를 다른 루프로 넘겨서 처리 할 수 있게 구성해 주시면 속도 향상에 도움이 될 겁니다.
사용자 이벤트와 타임스템프를 이용하시면 응답이 있을 때 마다 시간을 먼저 찍어 로그로 남길 수 있습니다.
03-13-2024 06:44 PM - 편집 03-13-2024 06:47 PM
버퍼중에 읽어 올 수 있는 바이트가 10 미만 일 경우엔 그대로 다 읽어오고, 10 이상일 경우엔 고정값 10으로 10바이트씩 읽어오시면 주신 딜레이마다 버퍼에 있는 데이터를 0~10바이트 씩 읽어올 것 입니다.
하지만 이렇게 하면 버퍼에 데이터로 가득 찰 수도 있다는 점 명심하세요~
정확히 10바이트씩 읽고 싶으시면 버퍼에 데이터가 10바이트가 존재하는지 확인하는 루프가 있어야겠내요. 없는 데이터를 읽을 순 없으니깐요.
시리얼데이터 여러개를 뽑기 때문에 배열에 적재를 하고 있습니다.
메인루프 부분에서 처리를 해야될 것 같은데 다른 방도가 있을까요?
응답값이 보낸 신호에 의한 응답값일 경우 보통 통신에 종료값으로 마침표를 찍어서 현재 통신 응답값의 마침을 표현합니다.
종료문자가 없는 데이터의 경우엔 지금처럼 지정된 타임 아웃동안 읽어서 처리 하시면 됩니다.
명령어 전송 이 후 일정 시간동안 해당 COM의 버퍼에 최종 데이터를 취득 후 배열로 정리 하시면 될것 같습니다.
생산자 소비자 구조를 참고하시기 바랍니다.
통신 코드를 생산자에 놓고, 소비자 쪽으로 Queue 를 이용해 데이터를 넘겨서 처리해 주시면 됩니다.
현재
(통신 및 적재) 루프
(저장) 루프
(통신)생산자 루프
(적재) 소비자 루프
(저장)루프
이렇게 분리해서 사용하라는 말씀이실까요?
적재를 하지 마시고... 스프레드시트 이어쓰기 같은걸 이용해 보시죠.
특정 서식을 요구하는게 아니라면 임의로 파일명을 만들어 데이터만 이어쓰기 하시면 되고
특정 서식을 요구한다면 마지막에 파일을 서식으로 변환하게 해 보세요.