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?
sul comando AT + CMGS una riga di comando come \ r \ n. Nello script AT vedo solo un \ r. – rene
Sì, è corretto, WriteLine produce linee aggiuntive ([Invio]) nel messaggio. –
controlla se il tuo modem supporta l'unicode !! – saeed