当前位置:编程学习 > C#/ASP.NET >>

c# serialPort

c# serialPort我想用c#编写两个串口通信显示的界面,一发一收。打开了两个串口serialPort实例,但是(serialPort1)另外一个串口发送数据,实际上没有发送成功,但是第一个serialPort实例(scomm)能够收到数据

 private void OpenPort()
        {
            //***避免串口死锁***
            sComm.WriteTimeout = 1000;  //写超时,如果底层串口驱动效率问题,能有效的避免死锁。
            sComm.ReadTimeout = 1000;   //读超时,同上。
            sComm.NewLine = "\r\n";     //回车换行。
            sComm.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sComm_DataReceived);   //注册事件。
            //***避免串口死锁***

            sComm.PortName = cmPort.Text;
            sComm.BaudRate = int.Parse(cmBaudRate.Text);
            sComm.DataBits = int.Parse(cmDataBit.Text);
            sComm.Parity = (Parity)Enum.Parse(typeof(Parity), cmParity.Text);
            sComm.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmStopBit.Text);
            sComm.Open();
        }

        private void ClosePort()
        {
            //安全关闭当前串口。
            //***避免串口死锁***
            sComm.DataReceived -= this.sComm_DataReceived;   //注销串口中断接收事件,避免下次再执行进来,造成死锁。
            while(IsReceving)
                Application.DoEvents();     //处理串口接收事件及其它系统消息。
            sComm.Close();                  //现在没有死锁,可以关闭串口。
            //***避免串口死锁***
        }
        #region 另外一个串口
        private void OpenPort1()
        {
            //***避免串口死锁***
            serialPort1.WriteTimeout = 1000;  //写超时,如果底层串口驱动效率问题,能有效的避免死锁。
            serialPort1.ReadTimeout = 1000;   //读超时,同上。
            serialPort1.NewLine = "\r\n";     //回车换行。
            serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);   //注册事件。
            //***避免串口死锁***

            serialPort1.PortName = cmPort1.Text;
            serialPort1.BaudRate = int.Parse(cmBaudRate1.Text);
            serialPort1.DataBits = int.Parse(cmDataBit1.Text);
            serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), cmParity1.Text);
            serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmStopBit1.Text);
            serialPort1.Open();
        }

        private void ClosePort1()
        {
            //安全关闭当前串口。
            //***避免串口死锁***
            serialPort1.DataReceived -= this.serialPort1_DataReceived;   //注销串口中断接收事件,避免下次再执行进来,造成死锁。
            while (IsReceving1)
                Application.DoEvents();     //处理串口接收事件及其它系统消息。
            serialPort1.Close();                  //现在没有死锁,可以关闭串口。
            //***避免串口死锁***
        }
 private void btOpen_Click1(object sender, EventArgs e)
        {
            lbComStat1.Visible = true;
            try
            {
                OpenPort1();     //安全打开串口。
                if (serialPort1.IsOpen)
                {
                    //btClose.Enabled = true;
                    //btOpen.Enabled = false;
                    lbComStat1.Text = "已打开 " + Convert.ToString(serialPort1.PortName) + ' ' + Convert.ToString(serialPort1.BaudRate) + ' ' + Convert.ToString(sComm.DataBits) + ' ' + Convert.ToString(sComm.Parity) + ' ' + Convert.ToString(sComm.StopBits);
                    tbSendStr.Focus();
                }
            }
            catch (Exception er)
            {
                StopAutoSend(); //停止自动发送。
                ClosePort1();    //安全关闭当前串口。
                MessageBox.Show("端口打开失败!" + er.Message, "串口出错,请检查通信线路连接");
                lbComStat1.Text = "已关闭该端口";
            }
            //check1.Visible = true;
            //btSend.Enabled = true;
        }
   private void btSend_Click1(object sender, EventArgs e)
        {
            //自动打开端口。
            if (!serialPort1.IsOpen)
                btOpen_Click1(null, null);
            //发送文本。
            try
            {
                string txt = tbSendStr.Text;

                Byte[] EncodeByte = strToHexByte(txt);

                //Byte[] EncodeByte = new byte[txt.Length * 2];
                //EncodeByte = Encoding.GetEncoding("GB2312").GetBytes(txt);
                int Len = EncodeByte.Length;
                serialPort1.Write(EncodeByte, 0, Len);
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message, "串口出错,请检查通信线路连接");
            }
            this.check2.Visible = true;
            this.测试完成.Visible = true;
        }
        #endregion
        private void StopAutoSend()
        {
            //停止自动发送字符串。
            TimeStr.Stop();
            TimeStr.Enabled = false;
            tbTimeStr.Enabled = true;
            cbTimeStr.Checked = false;
            //停止自动发送命令。
            //TimeHex.Stop();
            //TimeHex.Enabled = false;
            //tbTimeHex.Enabled = true;
            //cbTimeHex.Checked = false;
        }


   在某个条件下运行下面的程序
                    btOpen_Click1(null, null);
                    try
                    {
                        OpenPort();     //安全打开串口。
                        if (sComm.IsOpen)
                        {
                            btClose.Enabled = true;
                            btOpen.Enabled = false;
                            lbComStat.Text = "已打开 " + Convert.ToString(sComm.PortName) + ' ' + Convert.ToString(sComm.BaudRate) + ' ' + Convert.ToString(sComm.DataBits) + ' ' + Convert.ToString(sComm.Parity) + ' ' + Convert.ToString(sComm.StopBits);
                            tbSendStr.Focus();
                        }
                    }
                    catch (Exception er)
                    {
                        StopAutoSend(); //停止自动发送。
                        ClosePort();    //安全关闭当前串口。
                        MessageBox.Show("端口打开失败!" + er.Message, "串口出错,请检查通信线路连接");
                        lbComStat.Text = "已关闭";
                    }

 btSend_Click1(null, null);    

我一步步运行(借助串口通)监测端口,发现
sComm可以接收,但是serialPort1发送没有反应。 --------------------编程问答-------------------- 顶顶帖子先
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,