使用AT命令通过双卡手机发送短信
本文关键字:手机 AT 命令 使用 | 更新日期: 2023-09-27 18:13:14
我编写了一个使用AT命令发送SMS的应用程序,如下所示:
SerialPort _serialPort = new SerialPort("COM40", 115200);
Thread.Sleep(1000);
_serialPort.Open();
Thread.Sleep(1000);
_serialPort.Write("AT+CMGF=1'r");
Thread.Sleep(1000);
_serialPort.Write("AT+CMGS='"" + toPhoneNumber + "'"'r'n");
Thread.Sleep(1000);
_serialPort.Write("Test" + "'x1A");
Thread.Sleep(1000);
_serialPort.Close();
如果安装了电话并且COM端口号可用,则此代码可以正常工作。
当双卡手机连接到电脑时,是否有办法选择从哪个SIM卡发送信息?
3GPP规范中没有定义标准的AT命令。似乎各个设备制造商已经定义了自己的AT命令来选择SIM卡,例如这个。
联系设备制造商,询问他们对此有什么定义
public string ExecCommand(SerialPort port, string command, int responseTimeout, string errorMessage)
{
try
{
port.DiscardOutBuffer();
port.DiscardInBuffer();
receiveNow.Reset();
Thread.Sleep(200);
port.Write(command + "'r");
string input = ReadResponse(port, responseTimeout);
if ((input.Length == 0) || ((!input.EndsWith("'r'n> ")) && (!input.Contains("'r'nOK'r'n"))))
throw new ApplicationException("No success message was received.");
return input;
}
catch (Exception ex)
{
//int a = ErrorCmd(port);
throw ex;
}
}
public void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (e.EventType == SerialData.Chars)
{
receiveNow.Set();
}
}
catch (Exception ex)
{
throw ex;
}
}
public string ReadResponse(SerialPort port, int timeout)
{
string buffer = string.Empty;
try
{
do
{
//Thread.Sleep(5000);
jump: if (receiveNow.WaitOne(timeout, false))
{
string t = port.ReadExisting();
buffer += t;
}
else
{
if (buffer.Length == 0)
{
goto jump;
}
if (buffer.Length > 0)
{
//goto jump;
throw new ApplicationException("Response received is incomplete.");
}
else
throw new ApplicationException("No data received from phone.");
}
}
while (!buffer.Contains("'r'nOK'r'n") && !buffer.EndsWith("'r'n> ") && !buffer.EndsWith("'r'nERROR'r'n"));
}
catch (Exception ex)
{
throw ex;
}
return buffer;
}
public string ExecCommand(SerialPort port, string command, int responseTimeout, string errorMessage)
{
try
{
port.DiscardOutBuffer();
port.DiscardInBuffer();
receiveNow.Reset();
Thread.Sleep(200);
port.Write(command + "'r");
string input = ReadResponse(port, responseTimeout);
if ((input.Length == 0) || ((!input.EndsWith("'r'n> ")) && (!input.Contains("'r'nOK'r'n"))))
throw new ApplicationException("No success message was received.");
return input;
}
catch (Exception ex)
{
//int a = ErrorCmd(port);
throw ex;
}
}
public void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
if (e.EventType == SerialData.Chars)
{
receiveNow.Set();
}
}
catch (Exception ex)
{
throw ex;
}
}
public string ReadResponse(SerialPort port, int timeout)
{
string buffer = string.Empty;
try
{
do
{
//Thread.Sleep(5000);
jump: if (receiveNow.WaitOne(timeout, false))
{
string t = port.ReadExisting();
buffer += t;
}
else
{
if (buffer.Length == 0)
{
goto jump;
}
if (buffer.Length > 0)
{
//goto jump;
throw new ApplicationException("Response received is incomplete.");
}
else
throw new ApplicationException("No data received from phone.");
}
}
while (!buffer.Contains("'r'nOK'r'n") && !buffer.EndsWith("'r'n> ") && !buffer.EndsWith("'r'nERROR'r'n"));
}
catch (Exception ex)
{
throw ex;
}
return buffer;
}