上个礼拜做了一个使用C# SerialPort调试GSM模块的小练习,例子很简单。需要注意的是,SerialPort的配置必须正确,并且SerialPort的打开和读写可能需要等待一段时间(比如100ms)之后收到GSM模块的响应,也就是在这段时间内可能需要当前线程处于等待状态。
private void portConfigToolStripMenuItem_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
using (Form2 frm = new Form2())
{
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
try
{
XDocument doc = XDocument.Load(frm.FileName);
this.serialPort1.BaudRate = int.Parse(doc.Descendants("BaudRate").FirstOrDefault<XElement>().Value);
this.serialPort1.DataBits = Convert.ToInt32(doc.Descendants("DataBits").FirstOrDefault<XElement>().Value);
this.serialPort1.PortName = doc.Descendants("PortName").FirstOrDefault().Value;
this.serialPort1.StopBits = (System.IO.Ports.StopBits)(Enum.Parse(typeof(System.IO.Ports.StopBits), doc.Descendants("StopBits").FirstOrDefault().Value));
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
try
{
serialPort1.Open();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
System.Threading.Thread.Sleep(100);
}
private void Form1_Load(object sender, EventArgs e)
{
serialPort1.DataReceived += serialPort1_DataReceived;
}
void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.richTextBox1.Text += "Received>> " + this.serialPort1.ReadExisting() + "\r\n";
}
private void button1_Click(object sender, EventArgs e)
{
if (!serialPort1.IsOpen)
{
MessageBox.Show("Please config the serial port firstly.");
}
else
{
serialPort1.Write(this.textBox1.Text);
this.richTextBox1.Text += "Send>> " + this.textBox1.Text + "\r\n";
int idx = 0;
if (serialPort1.BytesToRead == 0 && idx < 3)
{
System.Threading.Thread.Sleep(100);
idx++;
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
string filename = "log.txt";
if (File.Exists(filename))
{
FileStream fs = new FileStream(filename, FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
sw.Write(string.Format("\r\n==={0}===\r\n", DateTime.Now.ToFileTime()) + this.richTextBox1.Text);
//fs.Close();
sw.Close();
}
else
{
StreamWriter sw = new StreamWriter(filename);
sw.Write(string.Format("\r\n==={0}===\r\n", DateTime.Now.ToFileTime()) + this.richTextBox1.Text);
sw.Close();
}
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
serial port配置form的代码:
private bool loadConfigFile(string filename)
{
if (File.Exists(filename))
{
XDocument doc = XDocument.Load(filename);
try
{
this.textBox1.Text = doc.Descendants("BaudRate").FirstOrDefault<XElement>().Value;
this.comboBox1.Text = doc.Descendants("DataBits").FirstOrDefault<XElement>().Value;
this.comboBox2.Text = doc.Descendants("PortName").FirstOrDefault<XElement>().Value;
this.comboBox3.Text = doc.Descendants("StopBits").FirstOrDefault<XElement>().Value;
}
catch
{
MessageBox.Show(string.Format("Config file {0} has been destoryed.", filename));
File.Delete(filename);
return false;
}
return true;
}
else
{
return false;
}
}
private void okbtn_Click(object sender, EventArgs e)
{
if (File.Exists(filename))
{
XDocument doc = XDocument.Load(filename);
try
{
doc.Descendants("BaudRate").FirstOrDefault<XElement>().Value = this.textBox1.Text;
doc.Descendants("DataBits").FirstOrDefault<XElement>().Value = this.comboBox1.Text;
doc.Descendants("PortName").FirstOrDefault<XElement>().Value = this.comboBox2.Text;
doc.Descendants("StopBits").FirstOrDefault<XElement>().Value = this.comboBox3.Text;
doc.Save(filename);
}
catch
{
MessageBox.Show(string.Format("Config file {0} has been destoryed.", filename));
File.Delete(filename);
}
}
else
{
XDocument doc = new XDocument();
doc.Add(new XElement("PortConfig", new XElement("BaudRate", this.textBox1.Text), new XElement("DataBits", this.comboBox1.Text),
new XElement("PortName", this.comboBox2.Text), new XElement("StopBits", this.comboBox3.Text)));
doc.Save(filename);
}
}
private void Form2_Load(object sender, EventArgs e)
{
loadConfigFile(filename);
string[] ports;
try
{
ports = SerialPort.GetPortNames();
comboBox2.Items.AddRange(ports);
comboBox2.SelectedItem = comboBox2.Items[0];
}
catch
{
MessageBox.Show("Failure occurs in get ports!");
this.cnlbtn.PerformClick();
}
}