2013-08-19 2 views
0

저는 C# 프로그래밍에서 약간 새로운 것이지만 어떻게 든 serialPort를 사용하여 GSM (SMS) 통신에 대한 훌륭한 기술과 지식을 필요로하는 프로젝트를 픽업 할 수있었습니다.GSM 통신, 크로스 스레딩

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO.Ports; 

namespace SMSget 
{ 
    public partial class SMSLogPanel : UserControl 
    { 
     #region default constructor 
     public SMSLogPanel() 
     { 
      InitializeComponent(); 
      serialPort1 = new SerialPort(); 
      serialPort1.DataBits = 8; 
      serialPort1.DtrEnable = true; 
      serialPort1.Encoding.Equals("iso-8859-1"); 
      serialPort1.Handshake = Handshake.RequestToSend; 
      serialPort1.Parity = Parity.None; 
      serialPort1.WriteTimeout = 300; 
      serialPort1.StopBits = StopBits.One; 
      checkLink(); 
     } 
    #endregion 
    #region checking communication and setting user controls... 
    private void checkLink() 
    { 
     GetValues value = new GetValues(); 
     string com = value.getPort(); 
     int baud = value.getBaud(); 
     int timeot = value.getTimeout(); 
     serialPort1.PortName = com; 
     serialPort1.BaudRate = baud; 
     serialPort1.ReadTimeout = timeot; 

     serialPort1.Open(); 
     if (serialPort1.IsOpen) 
     { 
      label1.Visible = true; 
     } 
     else 
     { 
      MessageBox.Show("Komunikacija sa modemom se ne može uspostaviti, molimo postavite novu konfiguraciju...!"); 
      this.Controls.Clear(); 
      SMSConfigPanel cfg = new SMSConfigPanel(); 
      cfg.Show(); 
      this.Controls.Add(cfg); 
     } 
     serialPort1.Close(); 
    } 
    #endregion 
    #region setiranje timer-a... 
    private void timer1_Tick(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
     execCommand(); 
     timer1.Start(); 
    } 
    #endregion 
    #region seting handler and executing AT commands 
    public void execCommand() 
    { 
     serialPort1.DataReceived += new SerialDataReceivedEventHandler(getResponse); 
     serialPort1.Open(); 
     //prazni se buffer da se ne pokupe neke vrijednosti koje ne trebaju... 
     serialPort1.DiscardInBuffer(); 

     if (!serialPort1.IsOpen) 
     { 
      MessageBox.Show("Modem nije spojen, molimo provjerite konfiguraciju...!"); 
      timer1.Stop(); 
     } 
     serialPort1.Write("AT+CMGF=1" + (char)(13)); 
     serialPort1.Write("AT+CMGL=\"ALL\"" + (char)(13)); 
    } 
    public void getResponse(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort serPort = (SerialPort)sender; 
     string input = serPort.ReadExisting(); 
     if (input.Contains("ERROR")) 
     { 
      //textBox2.Text = ""; 
     } 
     else if (input.Contains("+CMTI:")) 
     { 
      serialPort1.Write("AT+CMGF=1" + (char)(13)); 
      serialPort1.Write("AT+CMGL=\"ALL\"" + (char)(13)); 
     } 
     else if (input.Contains("+CMGL:")) 
     { 
      textBox1.Text = input; 
     } 
     else 
     { 
      return; 
     } 
     serialPort1.Close(); 
    } 
    #endregion 
} 

}

I 든 I가 통과 할 수없는 별개의 스레드를 사용하는 GetResponse (오브젝트 송신자 SerialDataReceivedEventArgs e)에 Serialport1을 포트, 입력 데이터를 폐쇄/개방하지이 분야 버그 (만들 관리 생각 사람이 좀 도와 수 있다면을 textBox1로 인해 크로스 스레드 문제 ..., 수신 된 UNREADED MESSAGES ...)를 읽기위한 명령 AT 아마 잘못에

, 나는 ...

매우 감사하게 될 것입니다

감사합니다. 그리고 최고의 안부. 크로스 스레드 예외

+0

크로스 스레드 예외가 있습니까? – Ehsan

답변

0

이유 : 그런 다음 다른 스레드가 생성되는 하나의 GUI 요소를 업데이트하려고

. 그것은 허용되지 않습니다.

솔루션 :

크로스 스레드 예외를 피하기 위해. 당신이 정확하지 않은이

this.Invoke((MethodInvoker) delegate 
    { 
     // update your textbox here 

    }); 
+0

시도해 보겠습니다.하지만 serialPort1을 열고 닫는 것이 제대로 이루어지면 나에게 혼란을 줄 수 있다고 조언 할 수 있습니까? serialPort1.Open() 및 serialPort1.Close()를 오른쪽에 설정하면 잘 모르겠습니다. 장소... – dovla091

0
serialPort1.Write("AT+CMGF=1" + (char)(13)); 
serialPort1.Write("AT+CMGL=\"ALL\"" + (char)(13)); 

같은 코드를 업데이트해야합니다. 은 각 명령 다음에 모뎀에서받은 응답을 읽고 구문 분석해야합니다.

serialPort1.Write("AT+CMGF=1" + (char)(13)); 
waitForFinalResponse(serialPort1); 
serialPort1.Write("AT+CMGL=\"ALL\"" + (char)(13)); 
waitForFinalResponse(serialPort1); 

과 같거나 serialPort1.Write와 waitForFinalResponse를 sendATCommand 함수에 결합 할 수 있습니다. 자세한 내용은 thisthis 답변을 참조하십시오.