겹쳐진 I/O를 사용할지 여부는 실제로 문제가 아닙니다. 겹치기 만하면 프로그램에 약간의 시간이 소요됩니다. 이와 같은 많은 프로그램을 작성했으며 결론은 스레드를 사용하여 모든 COM 루틴을 처리하는 것입니다. 스레드가 WaitForMultipleObjects()를 수행하는 동안 유휴 상태에있는 한이 스레드가 겹쳐진 메소드 나 동기 메소드를 호출하는지 여부는 덜 관련이 있습니다.
내 가장 최근의 COM 단자를 쓴 방법은이 (의사)입니다 :
thread()
{
while not kill the thread event
{
WaitForMultipleObjects (open port, close port, kill the thread event)
if (open port)
{
send();
receive();
wait_for_send_and_receive();
}
}
}
send()
{
take COM_port mutex
if(there is something to send)
{
copy send_data to local_data, protect this with mutex
WriteFileEx(COM_port,
local_data,
size,
some_overlapped_struct_stuff);
handle errors
}
release COM_port mutex
}
receive()
{
take COM_port mutex
ReadFileEx(COM_port, ...);
handle errors
release COM_port mutex
}
wait_for_send_and_receive()
{
WaitForMultipleObjects (open port,
close port,
kill the thread event,
send done event from send callback routine (overlapped I/O),
receive done event from receive callback routine (overlapped I/O)
);
}
는 당연히 이것이 확실히 당신이 셔플 데이터 등을 열기/닫기 COM 포트의 다양한 기능을 필요로하기 때문에 단순화 이상 몇몇 돌연변이가 필요하다.
회사 자산이 아니라면 실제 생산 코드를 공유 할 수 있습니다. (4 일은 약간의 낙관적 인 것으로 보입니다. 프로젝트 로그를 보면 생산에 COM 포트 터미널을 개발하는 데 몇 달이 걸렸습니다. COM 포트 드라이버만으로도 약 1k loc이고, Win API 호출이 많이 있습니다.
빠른 답변 주셔서 감사합니다. 몇 킬로 바이트의 데이터 (그림) 만 채널해야합니다. 그리고 어쩌면 몇 가지 명령을 사용할 수 있습니다. 저는 이것을 가능한 한 간단하게 유지해야하며 데이터를 수신하고 아무것도 펀치 할 수없는 모드로 구축해야합니다 (리모컨으로 제어해야 함) 짧은 여름 학교 프로젝트의 일부로 저는 고문에게 빌딩을 말했습니다. ing은 너무 많은 일이지만 잘 ... 어쨌든, 고맙습니다. 이것이 내 생각에 이것이 위로 조금 "조금"이라고 생각합니다. –
@JayEfGee 프로그램이 직렬 통신 이외의 다른 작업을 수행하지 않는다면 스레드 또는 중복 된 I/O없이 수행 할 수 있으므로 프로젝트가 훨씬 쉽습니다. – Lundin