c#串口收发数据

2015-11-20 15:10:09

补充:串口要添加对应的空间

//获取com口
using System.IO.Ports;

c#有串口控件

设计界面如下:

 重要的几个函数

            构造函数
            InitializeComponent();
            //为串口绑定接收数据事件
            this.serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            //初始化下拉串口名称列表框
            string[] ports = SerialPort.GetPortNames();
            Array.Sort(ports);
            dotlist.Add(100);
            /*
            串口设置
            this.serialPort1.PortNum=  comboBox1.Text.ToString(); //端口号
            this.serialPort1.Parity= 0; //奇偶校验
            this.serialPort1.BaudRate= 9600;//串口通信波特率
            this.serialPort1.ByteSize= 8; //数据位
            this.serialPort1.StopBits= 1;//停止位
            this.serialPort1.ReadTimeout= 1000; //读超时
            */
            comboBaudName.Items.AddRange(ports);
            //如果只有一个串口则选中
            if(comboBaudName.Items.Count==1) { comboBaudName.SelectedIndex = 0; }
        //默认波特率选9600
        this.comboBaudRate.Items.AddRange(new object[] {
            "2400",
            "4800",
            "9600",
            "19200",
            "38400",
            "57600",
            "115200"});
        if (ports.Length == 1) 
        { //comboBaudName.SelectedIndex = 0;  comboBaudRate.SelectedText = "9600"; }
        //打开或关闭串口
        private void button8_Click(object sender, EventArgs e)
        {
            //根据当前串口对象,来判断操作
            if(serialPort1.IsOpen)
            {
                //串口状态是open时,text是关闭 点击,则关闭串口
                serialPort1.Close();
                button8.Text = "打开";
            }
            else
            {
                //串口状态是close时,text是打开 点击,则设置好端口,波特率后打开
                if(comboBaudName.Text=="")
                {
                    MessageBox.Show("无效的串口!");
                    return;
                }
                if(comboBaudRate.Text=="")
                {
                    MessageBox.Show("请设置波特率!");
                    return;
                }
                serialPort1.PortName = comboBaudName.Text;
                serialPort1.BaudRate = int.Parse(comboBaudRate.Text);
                try
                {
                    serialPort1.Open();
                    button8.Text = "关闭";
                }
                catch(Exception e1)
                {
                    //捕获到异常信息,创建一个新的comm对象,之前的不能用了。
                    serialPort1 = new SerialPort();
                    //显示异常信息给客户。
                    MessageBox.Show(e1.Message);
                }
                
            }
        }
        //接收串口数据函数
        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            int n = serialPort1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
            received_count += n;//增加接收计数
            serialPort1.Read(buf, 0, n); ;//读取缓冲数据
            builder.Clear();//清除字符串构造器的内容
            //因为要访问ui资源,所以需要使用invoke方式同步ui。
            this.Invoke((EventHandler)(delegate
            {
                //直接按ASCII规则转换成字符串
                builder.Append(Encoding.ASCII.GetString(buf));
                //追加的形式添加到文本框末端,并滚动到最后。
                textBox1.AppendText(builder.ToString());
            }));


            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
        }
        //发送串口数据
        private void SendStringData(string data)
        {
            if(serialPort1.IsOpen)
            {
                serialPort1.Write(data);
            }
            else
            {
                MessageBox.Show("串口没有打开");
            }
        }
        //发送数据按钮
        private void button10_Click(object sender, EventArgs e)
        {
            if(serialPort1.IsOpen)
            {
                SendStringData(this.textBox2.Text);
            }
            
        }





效果图:

注意:串口号是程序打开时扫描的,这点不方便;只能是ASCII码,不然乱码。

发布了32 篇原创文章 · 获赞 14 · 访问量 11万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览