AT 명령을 사용하여 C# .Net에서 GSM 모뎀 (D-Link DWM-156) 용 응용 프로그램을 개발 중입니다. 페르시아어 또는 아랍어로 작성된 메시지와 같은 유니 코드 메시지를 보내는 데 문제가 있습니다. 여기 내 프로그램의 핵심 :C#에서 유니 코드 메시지 (예 : 페르시아어 및 아랍어)를 GSM 모뎀을 통해 AT 명령을 사용하여 전송
SerialPort GSMPort = new SerialPort();
GSMPort.PortName = "COM6";
GSMPort.BaudRate = 9600;
GSMPort.Parity = Parity.None;
GSMPort.DataBits = 8;
GSMPort.StopBits = StopBits.One;
GSMPort.Handshake = HandShake.RequestToSend;
GSMPort.DtrEnable = true;
GSMPort.RtsEnable = true;
GSMPort.Open();
GSMPort.Write("AT\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\r\n");
Thread.Sleep(1000);
GSMPort.Write(shortMessage+ "\x1A");
영어와 ASCII 문자는 잘 작동합니다. 나는 this article을 읽었으며 AT 명령을 사용하여 하이퍼 터미널에서 유니 코드 메시지를 보낼 수 있습니다 :이 명령이 제대로 작동하기 때문에
AT [Enter]
OK
AT+CSCS="UCS2" or AT+CSCS="HEX" [Enter] ---> We have to convert our message to hex
OK
AT+CMGF=1 [Enter]
OK
AT+CMGS="destinationNumber" [Enter]
> 0633064406270645002006450631062D06280627 ---> The hex format of our message (سلام مرحبا)
+CMGS: 139
OK
, 내 응용 프로그램에 GSMPort.Write("AT+CSCS=\"UCS2\"\r");
을 추가하고, 보내려고 0645 0631 062D 0628 0627 (مرحبا) 또는 (سلام).
GSMPort.Write("AT\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CSCS=\"UCS2\"\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\r\n");
Thread.Sleep(1000);
GSMPort.Write("0633064406270645" + "\x1A");
하이퍼 터미널의 AT 명령과 달리 대상은 올바른 문자를받지 못합니다. C# 코드와 하이퍼 터미널 코드에서 이러한 AT 명령의 차이점은 무엇입니까? 이 문제를 해결하도록 도와 주시면 감사하겠습니다.
추가 정보 : 당신은 내가 하이퍼 터미널에 의해 (예 : 페르시아어 문자 등) 유니 코드 메시지를 보내고 AT 명령을 사용하기위한 아무런 문제가 없습니다 알다시피. 아래 코드에서 나는 سلام을 보내려고하고 "0633064406270645"는 16 진수 형식입니다. 그러나 내 전화기에는 □□□□을받습니다.
GSMPort.Encoding = UnicodeEncoding.GetEncoding(1256);
GSMPort.Write("AT\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CSCS=\"UCS2\"\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGF=1\r");
Thread.Sleep(1000);
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\r\n");
Thread.Sleep(1000);
GSMPort.Write("0633064406270645" + "\x1A");
하이퍼 터미널 환경에서는 모든 것이 잘되고 سلام을받습니다.
AT [Enter]
OK
AT+CSCS="UCS2"
OK
AT+CMGF=1 [Enter]
OK
AT+CMGS="destinationNumber" [Enter]
> 0633064406270645 [Ctrl+Z]
+CMGS: 139
OK
내가 하이퍼 터미널 속성에서 내가 선택하면 나타났습니다 (가 ASCII의 셋업은, 아래의 사진을 확인하시기 바랍니다> 속성 -> 설정 - 인) "라인 피드와 함께 보낼 줄 종료"내가 가진 것 내가 C# 코드에서 가지고 있었던 것과 같은 문제. "줄 바꿈을 줄 바꿈으로 보내기"가 기본적으로 GSMPort.Write
에서 사용 가능하다고 생각하십니까? 그렇다면 어떻게 비활성화 할 수 있습니까? SerialPort
에 대한
에 AT + CMGS 명령을 사용하면 쓰기 작업이 \ r \ n으로 표시됩니다. AT 스크립트에서 나는 단지 \ r을 본다. – rene
맞습니다. WriteLine은 메시지에 여분의 줄 ([Enter])을 만듭니다. –
모뎀이 유니 코드를 지원하는지 확인하십시오 !! – saeed