저는 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 아마 잘못에
, 나는 ...
매우 감사하게 될 것입니다감사합니다. 그리고 최고의 안부. 크로스 스레드 예외
크로스 스레드 예외가 있습니까? – Ehsan