C#小练习:SerialPort读写操作

上个礼拜做了一个使用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();
            }
        }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值