2012-08-10 2 views
3

COM 포트와 통신하기 위해 터미널을 작성해야하며 콘솔 에서뿐만 아니라 COM 포트에서 명령을 보낼 수 있어야합니다. (두 개의 센서 노드를 통해 컴퓨터에 액세스하고 무선으로 서로 통신하므로 노드에서 컴퓨터로 무언가를 보낼 방법이 필요함)Com 포트 터미널을 구현하는 가장 쉬운 방법. (Windows, C)

이제는 Overlapped Serial Communication,하지만 확실하지는 않습니다. "동시에 전송 및 수신"을 구현하는 방법 - 일부분 만 문제를 해결할 수 있습니다. 저기에 정말 많은 정보가 없으므로, 내가 가장 빠르고 쉬운 방법을 구현하는 방법에 대한 어떤 조언도 환영합니다.

중복 된 I/O 통신은 내가 알 수있는 한 엄밀히 말해서 시간 상 친절하지 않습니다. 다중 스레딩을 사용하여이 작업을 수행 할 수 있습니까? 그럴 경우 몇 밀리 초마다 버퍼를 읽고 입력을위한 자체 스레드를 만들어야 할 것이라고 추측하고 있습니까?

답변

2

겹쳐진 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 호출이 많이 있습니다.

+0

빠른 답변 주셔서 감사합니다. 몇 킬로 바이트의 데이터 (그림) 만 채널해야합니다. 그리고 어쩌면 몇 가지 명령을 사용할 수 있습니다. 저는 이것을 가능한 한 간단하게 유지해야하며 데이터를 수신하고 아무것도 펀치 할 수없는 모드로 구축해야합니다 (리모컨으로 제어해야 함) 짧은 여름 학교 프로젝트의 일부로 저는 고문에게 빌딩을 말했습니다. ing은 너무 많은 일이지만 잘 ... 어쨌든, 고맙습니다. 이것이 내 생각에 이것이 위로 조금 "조금"이라고 생각합니다. –

+0

@JayEfGee 프로그램이 직렬 통신 이외의 다른 작업을 수행하지 않는다면 스레드 또는 중복 된 I/O없이 수행 할 수 있으므로 프로젝트가 훨씬 쉽습니다. – Lundin