문제

Wavecom Supreme GSM 모뎀이 있습니다. 모뎀과 의사 소통하고 수신 한 문자 메시지를 읽는 간단한 응용 프로그램을 작성했습니다.

내 응용 프로그램은 메모리에 저장하는 메시지 수에 대한 정보를 위해 모뎀을 쿼리하며 숫자가 0보다 큰 경우 모뎀의 메모리에서 삭제하는 메시지를 읽습니다. 몇 초마다 모뎀을이 방법으로 쿼리합니다.

그러나 불행히도 모뎀은 몇 분마다 매달려 있고 내가 보내는 AT 명령에 응답하지 않습니다. 커뮤니케이션을 잠금 해제하기 위해 제기 한 유일한 해결책은 직렬 포트를 닫고 새로 열는 것입니다. 그런 다음 모뎀이 매달려있을 때 직렬 포트를 다시 개봉 해야하는 다음 몇 분 동안 모든 것이 정상입니다.

물론 모뎀의 잘못이 될 수 있지만, 내가 의사 소통하는 방식이 괜찮은지 궁금합니다.

전나무의 전나무로, 나는 비동기 작업을 위해 모뎀의 직렬 포트를 열었습니다. 그런 다음 DCB 구조를 다음과 같이 설정했습니다.

GetCommState(PortHandle, DCB);
DCB.BaudRate := 115200;
DCB.ByteSize := 8;
DCB.Parity := NOPARITY;
DCB.StopBits := ONESTOPBIT;
DCB.EvtChar := #13;
SetCommState(PortHandle, DCB);
SetCommMask(PortHandle, EV_RXFLAG);

//the modem does not respond without setting these:
EscapeCommFunction(PortHandle, SETDTR);
EscapeCommFunction(PortHandle, SETRTS);

그리고 내가하는 모든 일은 명령으로 보내고 모뎀의 응답을 기다리는 것입니다. 나는 흐름 제어를 사용하지 않습니다. 내가하는 모든 일은 Comm 이벤트를 기다리고, 모뎀이 응답 할 때 직렬 포트 큐의 데이터를 읽고, 명령에 일부를 작성하고 #13 문자를 작성하여 메시지의 모뎀을 쿼리하는 것입니다.

DCB 구조를 부적절하게 설정했을 수도 있다고 생각합니다. 보시다시피, 나는 그 필드 중 일부를 수정하지 않기 때문입니다. 직렬 포트에 대한 지식으로는 충분하지 않기 때문에 RTS 및 DTR 제어를 설정하는 방법 (활성화/비활성화/핸드 셰이크/토글)을 모릅니다.

모뎀을 처리하는 이런 방식으로 명백한 실수를 발견했다면, 내가 잘못한 일을 설명했다면 감사 할 것입니다. 반면에 모든 것이 괜찮다면 아마도 모뎀이 왜 매달려 있는지 알 수 있었을까요?

미리 감사드립니다.

도움이 되었습니까?

해결책

일반적으로 DCB 설정은 가장 먼저 확인해야 할 사항입니다. 모뎀 문서는 직렬 포트 설정을 언급해야합니다. 모뎀의 모델 번호로 온라인으로 검색하지 않으면

다른 팁

장치 관리자, 모뎀 및 프로그램의 흐름 제어가 모두 동일하게 설정되어 있는지 확인하십시오. Delphi를 모르지만 DCB에는 "플래그"필드가 있어야한다고 생각합니다. 하드웨어 흐름 제어를 위해 24로 설정하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top