無法使用gsm調制解調器使用System.IO.Ports通過C#代碼發送SMS單擊一個按鈕,將短信發送到NumTxt文本框中輸入的數字,并發送在SMSTxt文本框中輸入的文本。在texbox中輸入的端口名稱ComPort這是按鈕單擊事件的事件處理程序。 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);
}
}我昨天能夠使用這個代碼發送短信,但我不知道為什么它不再起作用..沒有例外拋出。當我使用gsm調制解調器附帶的軟件時,我可以發送短信。但不是通過C#代碼。如果有人能指出上述代碼中的錯誤,我將非常感激。
1 回答

UYOU
TA貢獻1878條經驗 獲得超4個贊
你永遠不應該,永遠不要使用睡眠代替等待調制解調器的最終結果代碼。正如您不會編寫完全忽略來自http服務器的所有響應的http客戶端一樣,您不應將AT命令發送到調制解調器并完全忽略它發回的響應。您必須閱讀并解析調制解調器發回給您的所有內容。沒有別的東西能可靠地運作。
我的建議是,您首先要獲取V.250標準的副本,并至少閱讀第5章的全部內容。該標準是AT命令處理的圣經,并將教您大量有關AT命令處理的內容。例如,使用WriteLine
和/或Environment.NewLine
錯誤; AT命令行應該單獨終止,\r
沒有別的。
只是為了強調該文件的重要性:即使在愛立信手機中實施AT命令十多年后,我和我的同事仍然定期查閱該標準。
事實上現在停止閱讀這個答案,下載該文件,閱讀第5章的全部內容,然后再回頭閱讀其余內容。
對于發送不特別關心響應1的命令,唯一可靠的方法是執行類似的操作
serialport.Open();...// start sending AT+CMGF=1serialport.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();
其中readLine
函數從串行端口,直到它接收與終止的完整的線讀出一個與一個字節\r\n
,然后返回該行。
您可以查看atinout的代碼以獲取該is_final_result_code
功能的示例(您也可以在ST-Ericsson的U300 RIL中isFinalResponseError
與isFinalResponseSuccess
2和2進行比較)。
- 1 回答
- 0 關注
- 505 瀏覽
添加回答
舉報
0/150
提交
取消