2012-07-20 70 views
3

我正在開發一個將讀取和寫入數據到gsm調制解調器的應用程序。當我關閉調制解調器並再次打開時,在啓動時我需要發送一個AT命令,以便該調制解調器自動設置爲端口給定的設置。當我在超級終端中給出這個命令時,它不會顯示,但命令被髮送到調制解調器。並且調制解調器將自己設置爲我爲超級終端端口設置提供的設置。從那時起我可以發送其餘的命令。但在我的應用程序中,我無法發送第一個AT命令,所以我通過超級終端手動執行。爲什麼這不會通過我的應用程序發生?我也嘗試使用按鈕單擊發送此命令,但仍未在端口上執行。在調制解調器啓動時執行AT命令的問題

 port.Open(); 
     port.DtrEnable = true; 
     port.RtsEnable = true; 

     if (port != null) 
     { 
      btn_connect.Enabled = false; 
      btn_disconnect.Enabled = true; 
      port.WriteLine("AT"); 

      port.WriteLine("AT+CLIP=1"); 

      port.WriteLine("AT+CMGF=1"); 

      con_status.Text = "Connected at " + cboPortName.Text; 
     } 

,我在我的應用程序給端口設置包括:

  port.PortName = cboPortName.Text; 
      port.BaudRate = Convert.ToInt32(this.cboBaudRate.Text); //9600 
      port.DataBits = Convert.ToInt32(this.cboDataBits.Text); //8 
      port.ReadTimeout = Convert.ToInt32(this.txtReadTimeOut.Text); //300 
      port.WriteTimeout = Convert.ToInt32(this.txtWriteTimeOut.Text); //300 
      port.StopBits = StopBits.One; //1 
      port.Parity = Parity.None; // None 
      port.Encoding = Encoding.GetEncoding("iso-8859-1"); 
      port.Open(); 
      port.DtrEnable = true; 
      port.RtsEnable = true; 
+0

爲什麼了Thread.Sleep不行? – SMK 2012-07-20 04:59:06

+0

因爲在所有這些命令之前執行thread.sleep(),然後再次執行所有這些命令而沒有時間延遲。 – Cdeez 2012-07-20 05:18:13

+0

什麼是您的GSM模塊的確切數量,天線的阻抗是問題 – 2012-07-26 05:28:40

回答

1

的問題就解決了。將來可能會幫助某個人,這就是我所做的。

我將這兩行設置添加到我的端口,同時建立連接,這是我之前給出的。

  port.DiscardOutBuffer(); 
      port.DiscardInBuffer(); 

但我不知道爲什麼將這些設置所做的差異,解決我的問題,但它的工作:)

+0

我會很高興,如果有些機構可以解釋爲什麼這兩個設置使我的端口有所不同? – Cdeez 2012-07-27 10:57:36

+1

您可以在這裏查看SerialPort的源代碼:http://typedescriptor.net/browse/types/13811-System.IO.Ports.SerialPort ....您的Discard調用最終會執行PurgeComm原生WIN32調用.. 。必須重置硬件流控制行....您可以嘗試在打開前設置您的DtrEnable/RtsEnable = true行。 – 2012-07-27 19:45:47

0

爲什麼你需要的命令之間的時間差距......回龍我曾在AT傳遞到調制解調器的命令,我記得路過命令比如「AT + FCLASS = 8」「ATS0 = 1」「AT + VTX」連續不斷,你是否確定這個延遲的事情?

也只是

port.WriteLine("AT+CLIP=1"); 
雖然我不知道,我沒有調制解調器現在就試試,但我認爲我們用來打發AT命令後回車鍵以及

可能無法工作,所以該命令應該是

port.WriteLine("AT+CLIP=1" + System.Convert.ToChar(13).ToString()); 

看看是否改變這有助於...

+0

如果它是port.Write(),那麼你需要在最後輸入。但是因爲它是Port.WriteLine(),所以你不需要通過ENTER。我嘗試了連續的時間沒有時間延遲的命令,但他們不工作 – Cdeez 2012-07-20 05:16:41

+0

好吧,那可能不是一個問題,然後...但我有一種感覺,它不是延遲這是你的問題的原因...嘗試發送只是一個命令,看看它是否適用於例如ATDT命令撥號...或者在你的每個端口上放置斷點,寫入線路並手動模擬延遲和檢查...如果它真的是延遲問題,那麼我認爲它應該不難添加延遲 – 2012-07-20 05:24:20

+1

我曾嘗試只發送一個命令,如AT + CMGF = 1,並且也使用了一箇中斷點。它被執行,但不知道爲什麼這個命令沒有在端口執行。證明是我在超級終端中檢查它,並且設置沒有改變。 – Cdeez 2012-07-20 05:32:07

2

兩件事情來檢查,波特率和迴響。

SerialPort類默認使用9600。

通常情況下,調制解調器處於自動波特模式,當發送「AT」命令時,它會自行調整爲COM端口鏈路的波特率。這是不可能的,但是你的調制解調器可能在一個固定的BaudRate下運行,並且不會調整...因此檢查你在超級終端中使用的BaudRate並使用相同的BaudRate。回聲 - 看到命令被髮送(並且您的調制解調器正在響應),我相信您需要在調制解調器中打開回顯,即發送到調制解調器的任何字符都會發送/回顯回到你身邊。

(你可以或者打開超級終端本地回顯...但你不希望......你想知道更多調制解調器看到你的角色)

如果你不能得到調制解調器回顯您發送的內容,然後您對配置串口鏈接的方式有問題(例如,使用錯誤的流量控制握手/奇偶校驗等,或者未提高流量控制狀態行)。

。假定你的調制解調器配置爲使用RTS/CTS流量控制,你有沒有嘗試過:

port.Handshake = HandShake.RequestToSend? (即硬件控制線流量控制)。

所以,它看起來可能是該調制解調器的eeprom默認值不是回顯(即有人改變了回顯並完成了一個& W0),或者超級終端配置爲在調制解調器上關閉它打開它的端口,即它有一個AT「初始化字符串」!)。您應該檢查初始化字符串是用於該端口的,並在使用SerialPort類時將其複製/使用。

另一個最佳實踐是在發出下一個AT命令之前等待響應代碼 - 延遲是實現它的一種方式,但不是最佳實踐,因爲某些命令可能需要不同的時間來執行....並且某些調制解調器不喜歡在「繁忙」時接收其他命令。

試試這個命令1:

  • AT & FE1(重置爲出廠設置並打開呼應)

    (注意& F是不必要的,如果你只是在調制解調器接通理所應當無論如何,在那個點的出廠設置......但是這樣做沒有什麼壞處,E1會打開回聲)。

  • 等待OK響應碼

    如果使用超級終端,那麼你只是在視覺上等待響應代碼回來,如果你在輸入命令(或者讓你的腳本等待,如果使用腳本發送命令) ,或者如果在代碼中發送AT命令,您的代碼需要捕獲響應並採取相應措施。

  • 發出下一個命令(例如,您AT + CLIP = 1)

  • 等待OK,ERROR,或一個命令特定響應代碼。

    注意:即使使用相同的命令,不同的調制解調器也可能使用不同的響應代碼。

  • 發出下一個命令,等等等等

這裏有一些鏈接,可能會派上用場參考ie顯示香精或AT命令,以及一些超級參考:

+0

我的調制解調器處於自動波特模式,並且在啓動後向它發送「AT」命令時,將其自身調整爲COM端口鏈路的波特率。我使用一個文本框來檢查當我提供這些命令時端口上的數據是什麼。這是第一次,我試着給AT指令多少次,端口沒有任何變化,調制解調器沒有響應。然後我給了超級終端的AT,首先它將自己設置爲波特率,並從下一個命令中顯示我的終端上的數據。所以第一個AT命令只是通過我的超級終端,而不是從我的應用程序。 :( – Cdeez 2012-07-23 08:28:07

+0

檢查BytesToWrite的值...如果它不是0,那麼這意味着你有某種流量控制問題,即緩衝區沒有被寫出,因爲它認爲串行鏈路/調制解調器沒有準備好接收。你能告訴我們你用來初始化串口的代碼: – 2012-07-23 08:49:47

+0

'port.PortName = cboPortName.Text; port.BaudRate = Convert.ToInt32(cboBaudRate.Text); port.DataBits = Convert.ToInt32(this.cboDataBits的.text); port.ReadTimeout = Convert.ToInt32(this.txtReadTimeOut.Text); port.WriteTimeout = Convert.ToInt32(this.txtWriteTimeOut.Text); port.StopBits = StopBits.One; port.Parity = Parity.None; port.Encoding = Encoding.GetEncoding(「iso-8859-1」); port.Open(); port.DtrEnable = true; port.RtsEnable = true;' – Cdeez 2012-07-23 11:53:43

相關問題