2013-03-09 28 views
9

Sto sviluppando un'applicazione per modem GSM (D-Link DWM-156) in C# .Net utilizzando i comandi AT. Ho un problema nell'inviare messaggi Unicode (come messaggi scritti in persiano o in arabo). Ecco il nocciolo del mio programma:Invio di messaggi Unicode (come in persiano e arabo) in C# utilizzando comandi AT tramite modem GSM

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"); 

Funziona bene per le lettere inglese e ASCII. Ho letto this article e possono inviare messaggi Unicode in HyperTerminal utilizzando comandi 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 

Da questo comandi funzionava correttamente, ho aggiunto GSMPort.Write("AT+CSCS=\"UCS2\"\r"); alla mia domanda, e ho cercato di inviare 0645 0631 062D 0628 0627 (مرحبا) oppure (سلام).

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"); 

Ma a differenza dei comandi AT in Hyperterminal, la destinazione non riceve le lettere corrette. Qual è la differenza tra questi comandi AT in codice C# e codice Hyperterminal? Apprezzerò se mi aiuti a risolvere questo problema.


Ulteriori informazioni: Come sapete non ho alcun problema per l'invio di messaggi Unicode (come le lettere persiane) da HyperTerminal e utilizzando i comandi AT. Nel codice seguente provo a inviare سلام, e "0633064406270645" è la forma esadecimale di esso. Ma ricevo □□□□ nel mio telefono.

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"); 

Nell'ambiente HyperTerminal, D'altra parte, tutto va bene e ricevo سلام.

AT [Enter] 
OK 
AT+CSCS="UCS2" 
OK 
AT+CMGF=1 [Enter] 
OK 
AT+CMGS="destinationNumber" [Enter] 
> 0633064406270645 [Ctrl+Z] 
+CMGS: 139 
OK 

ho notato che nelle proprietà di HyperTerminal se controllo la "linea inviare termina con avanzamenti di riga" (è in proprietà-> Impostazioni-> Impostazioni ASCII, si prega di verificare l'immagine qui sotto), avrò lo stesso problema che avevo nel codice C#. Penso che "send line ends with line feeds" sia abilitato in GSMPort.Write di default? Se sì, come posso disabilitarlo?

enter image description here

+1

sul comando AT + CMGS una riga di comando come \ r \ n. Nello script AT vedo solo un \ r. – rene

+0

Sì, è corretto, WriteLine produce linee aggiuntive ([Invio]) nel messaggio. –

+0

controlla se il tuo modem supporta l'unicode !! – saeed

risposta

8

ho finalmente scoperto Come risolvere questo problema.Come ho detto nella sezione "Informazioni aggiuntive" della mia domanda, l'invio della linea termina con i feed di riga ha causato questa discrepanza tra SerialPort in C# e comandi AT in hyperterminal per l'invio di messaggi Unicode. Ho appena sostituito \r con i feed di riga \n. Il codice modificato è il seguente:

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"); 

Lasciare SerialPort.Encoding e SerialPort.NewLine proprietà invariato. Non è necessario modificare i loro valori predefiniti, basta impostare AT+CSCS="UCS2" per inviare messaggi in formato Unicode.

+0

Mi ha aiutato così l'ho contrassegnato come utile ma ho ancora una domanda: convertite tutti i messaggi in HEX incluso ASCII o UNICODE? Apprezzo se tu potessi farmi sapere cosa hai fatto alla fine. – Masoud

+0

@Masoud Ho contattato per inviare sms arabi usando il codice sopra ma ho ricevuto "risposta ricevuta incompleta" Potete aiutarmi –

2

La codifica predefinita per SerialPort è . Impostare SerialPort.Encoding in una codifica per supportare il set di caratteri che si sta utilizzando (come Encoding.UTF32) o utilizzare SerialPort.Write(char[], int, int) e convertire la stringa Unicode in byte in qualsiasi modo si preferisca.

+0

Grazie per la risposta. Ho modificato la codifica di GSMPort.Encoding in Encoding.UTF8, Encoding.Unicode e Encoding.UTF32. Ma nessuno di questi cambiamenti ha avuto successo. Il problema persiste: GSMPort.Write ("AT + CSCS = \" UCS2 \ "\ r"); GSMPort.Encoding = Encoding.Unicode; –

+0

Assicurati di impostare 'Encoding' * prima * tu chiami' Write' –

+0

Sì Avevo chiamato 'GSMPort.Encoding' in anticipo prima di tutti' Write's, ma ancora non funziona. –

2

Prima di tutto controllare il supporto modem unicode quindi modificare il codice per questo
dobbiamo specificare il corretto DCS (Data Coding Scheme) per i messaggi Unicode, che è 0x08.

Possiamo impostare questo valore modificando il quarto parametro del comando AT + CSMP a '8':

AT + CSMP = 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

Posso inviare messaggi Unicode utilizzando i comandi AT nell'ambiente Hyperterminal, quindi sì, sono sicuro che il modem supporti Unicode. Grazie per la soluzione, ho provato 'GSMPort.Write (" AT + CSMP = 1.167,0,8 \ r ");' ma non cambia nulla. Usando 'AT + CSMP?' Questa struttura in hyperterminal è '+ AT + CSMP = 1,71,0,0' ma non funziona neanche. Ho anche provato 'AT + CSMP = 1,71,0,8'. –

+0

funziona correttamente quando si invia sms tramite i comandi iperterminali, in tal caso, qual è la coda dei comandi – saeed

+0

Controllare la mia domanda. Descrivo quale sequenza di comandi AT ho usato in hyperterminal. Se hai bisogno di ulteriori informazioni sul mio modem e sul suo stato per favore fammi sapere. –