Não é possível enviar SMS por meio do código C # usando System.IO.Ports usando o modem gsm

Um botão, quando clicado, envia um sms para o número typescript na checkbox de texto NumTxt e envia o texto typescript na checkbox de texto SMSTxt. Nome da porta inserido no texbox ComPort Aqui está o manipulador de events do evento de clique do botão.

using System.IO.Ports; private void button1_Click(object sender, EventArgs e) { try { int mSpeed = 1; serialport.PortName = ComPort.Text; serialport.BaudRate = 96000; serialport.Parity = Parity.None; serialport.DataBits = 8; serialport.StopBits = StopBits.One; serialport.Handshake = Handshake.XOnXOff; serialport.DtrEnable = true; serialport.RtsEnable = true; serialport.NewLine = Environment.NewLine; Console.WriteLine("1a"); try { serialport.Open(); } catch (Exception) { MessageBox.Show("Try another Port." + Environment.NewLine + "Phone not detected or The requested resource is in use.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Console.WriteLine("2a"); serialport.WriteLine("AT+CMGF=1" + Environment.NewLine); System.Threading.Thread.Sleep(200); serialport.WriteLine("AT+CSCS=GSM" + Environment.NewLine); System.Threading.Thread.Sleep(200); serialport.WriteLine("AT+CMGS=" + (char)34 + NumTxt.Text + (char)34 + Environment.NewLine); System.Threading.Thread.Sleep(200); serialport.WriteLine(SMSTxt.Text + (char)26); System.Threading.Thread.Sleep(mSpeed); serialport.Close(); } catch (Exception) { if (serialport.IsOpen) serialport.Close(); MessageBox.Show("Couldn't send the SMS.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 

Eu era capaz de enviar o sms usando este código muito ontem, mas eu não sei porque não funciona mais .. sem exceções lançadas. Quando uso o software que vem com o modem gsm, posso enviar sms. Mas não através do código C #. Se alguém puder apontar o erro no código acima, ficarei muito grato.

    Você nunca, nunca deve usar o sono como um substituto para esperar pelo código do resultado final do modem. Assim como você não escreveria um cliente http que ignore completamente todas as respostas do servidor http, você não deve enviar comandos AT para um modem e ignorar completamente as respostas que ele envia de volta. Você deve ler e analisar tudo o que o modem envia de volta para você. Nada mais funcionará de forma confiável.

    Minha sugestão é que você comece buscando uma cópia do padrão V.250 e leia pelo menos todo o capítulo 5. Esse padrão é a bíblia para o manuseio do comando AT e ensinará a você uma quantidade enorme de manuseio do comando AT. Como por exemplo, o uso de WriteLine e / ou Environment.NewLine está errado; AT linhas de comando devem ser terminadas com \r sozinho e nada mais.


    Só para enfatizar a importância desse documento: mesmo depois de trabalhar com a implementação do comando AT em telefones móveis na Ericsson por mais de uma década, eu e meus colegas ainda consultamos esse padrão regularmente .

    Na verdade, pare de ler esta resposta aqui agora, baixe esse documento, leia todo o capítulo 5 antes de voltar para ler o resto.


    Para enviar comandos nos quais você não se importa particularmente com a resposta 1 , a única abordagem confiável é fazer algo semelhante a

     serialport.Open(); ... // start sending AT+CMGF=1 serialport.Write("AT+CMGF=1\r"); do { line = readLine(serialport); } while (! is_final_result_code(line)) // Sending of AT+CMGF=1 command finished (successfully or not) ... serialport.Close(); 

    onde a function readLine lê um e um byte da porta serial até que tenha recebido uma linha completa terminada com \r\n e, em seguida, retorna essa linha.

    Você pode olhar o código para um exemplo para a function is_final_result_code (você também pode comparar com isFinalResponseError e isFinalResponseSuccess 2 no U300 RIL da ST-Ericsson ).

    O comando AT + CMGS deve ser tratado de forma diferente. Você deve aguardar a resposta "\r\n> " do modem antes de enviar a carga útil, consulte a primeira parte desta resposta para obter detalhes.


    1 Embora você provavelmente deva se preocupar se o comando foi executado com sucesso ou não. Veja esta resposta para uma maneira realista de enviar uma linha de comando e analisar as linhas de resposta.

    2 Observe que CONNECT não é um código de resultado final, é um código de resultado intermediário, portanto, o nome isFinalResponseSuccess não está, estritamente falando, 100% correto.