2013-03-09 2 views
9

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에 대한

enter image description here

+1

에 AT + CMGS 명령을 사용하면 쓰기 작업이 \ r \ n으로 표시됩니다. AT 스크립트에서 나는 단지 \ r을 본다. – rene

+0

맞습니다. WriteLine은 메시지에 여분의 줄 ([Enter])을 만듭니다. –

+0

모뎀이 유니 코드를 지원하는지 확인하십시오 !! – saeed

답변

8

드디어 발견했다 이 문제를 해결하는 방법.내 질문의 "추가 정보"절에서 말했듯이 줄 넘김으로 줄 끝을 보내면 C#의 SerialPort과 유니 코드 메시지를 보내는 하이퍼 터미널의 AT 명령간에이 불일치가 발생했습니다. 방금 \r\n 줄 바꿈으로 바꿨습니다. 수정 된 코드는 다음과 같다 :

GSMPort.Write("AT\n"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CSCS=\"UCS2\"\n"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGF=1\n"); 
Thread.Sleep(1000); 
GSMPort.Write("AT+CMGS=\"" + destinationNumber + "\"\n"); 
Thread.Sleep(1000); 
GSMPort.Write("0633064406270645" + "\x1A"); 

휴가 SerialPort.EncodingSerialPort.NewLine 속성 변경. 디폴트 값을 변경할 필요가 없습니다. AT+CSCS="UCS2"을 유니 코드 형식으로 메시지를 보내도록 설정하십시오.

+0

도움이되었으므로 유용하다고 표시되었지만 여전히 질문이 있습니다. ASCII 또는 유니 코드를 포함하여 모든 메시지를 16 진수로 변환합니까? 마침내 뭘했는지 알려 주시면 감사하겠습니다. – Masoud

+0

@Masoud 위의 코드를 사용하여 아랍어 SMS를 보내 겠지만 "받은 반응이 불완전합니다." –

2

기본 인코딩은 입니다. 사용하고있는 문자 세트 (Encoding.UTF32 등)를 지원하는 인코딩에 SerialPort.Encoding을 설정하거나 SerialPort.Write(char[], int, int)을 사용하고 원하는 방식으로 유니 코드 문자열을 바이트로 변환하십시오. 모든

+0

당신의 대답을위한 감사합니다. GSMPort.Encoding의 인코딩을 Encoding.UTF8, Encoding.Unicode 및 Encoding.UTF32로 변경했습니다. 그러나 이러한 변화는 성공하지 못했습니다. 문제가 여전히 존재합니다 : GSMPort.Write ("AT + CSCS = \"UCS2 \ "\ r"); GSMPort.Encoding = Encoding.Unicode; –

+0

'Write '를 호출하기 전에'Encoding' *을 설정해야합니다. –

+0

예'Write's보다 먼저 GSMPort.Encoding을 호출했으나 여전히 작동하지 않습니다. –

2

먼저 우리는을 0x08 인 유니 코드 메시지에 대한 올바른 DCS (코딩 방식 데이터)를 지정해야이
에 코드를 변경 모뎀 지원 unicode을 확인합니다.

우리는 '8'에 AT + CSMP 명령의 제 파라미터를 변경하여,이 값을 설정할 수

+ CSMP AT

= 1,167,0,8

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+CSMP=1,167,0,8\r"); //AT+CSMP=1,167,0,8 
    Thread.Sleep(1000); 
    GSMPort.WriteLine("AT+CMGS=\"" + destinationNumber + "\"\r\n"); 
    Thread.Sleep(1000); 
    GSMPort.WriteLine("0633064406270645" + "\x1A"); 
+0

하이퍼 터미널 환경에서 AT 명령을 사용하여 유니 코드 메시지를 보낼 수 있으므로 모뎀이 유니 코드를 지원한다고 확신합니다. 귀하의 솔루션 주셔서 감사합니다, 나는'GSMPort.Write ("AT + CSMP = 1,167,0,8 \ r");'시도했지만 아무것도 변경하지 않습니다. 'AT + CSMP? '를 사용하면 하이퍼 터미널에서이 구조체는'+ AT + CSMP = 1,71,0,0'이지만 그것은 작동하지 않습니다. 나는 또한'AT + CSMP = 1,71,0,8'을 시도했다. –

+0

하이퍼 터미널 명령으로 SMS를 보내면 명령 대기열이 무엇인지 잘 알 수 있습니다. – saeed

+0

제 질문을 확인해주십시오. 필자는 하이퍼 터미널에서 어떤 일련의 AT 명령을 사용했는지 설명합니다. 모뎀 및 상태에 대한 추가 정보가 필요하면 알려주십시오. –