当前位置: 代码网 > it编程>编程语言>Asp.net > C# Winform编程 串口通信简单示例

C# Winform编程 串口通信简单示例

2024年08月01日 Asp.net 我要评论
【代码】C# 串口通信简单示例。

c# winform编程 简单串口通信示例

串口通信

c# 串口通信主要操作:

  • 命名空间:using system.io.ports;
  • 获取端口:string[] ports = system.io.ports.serialport.getportnames();
  • 设置端口名:serialport1.portname = “com1”; // 字符串
  • 设置波特率:serialport1.baudrate = 115200;// int.parse(“115200”);
  • 设置数据位:serialport1.databits = 1; // int.parse(“1”);
  • 设置停止位:serialport1.stopbits = stopbits.one;
    • stopbits.one:停止位1
    • stopbits.onepointfive:停止位1.5
    • stopbits.two:停止位2
  • 设置校验位:serialport1.parity = parity.none;
    • parity.none:无
    • parity.even:奇校验
    • parity.odd:偶校验
  • 打开串口:serialport1.open();
  • 关闭串口:serialport1.close();
  • 可读字节:serialport1.bytestoread;
  • 读取数据:serialport1.read(buffer, 0, len);
  • 写入数据:serialport1.write(buffer);
  • 接收事件: xxx_datareceived(object sender, system.io.ports.serialdatareceivedeventargs e);

示例代码

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
using system.io;
using system.io.ports;

namespace serial_tools
{
    public partial class form1 : form
    {
        string serialportname;

        public form1()
        {
            initializecomponent();
        }
        private void form1_load(object sender, eventargs e)
        {
            string[] ports = system.io.ports.serialport.getportnames(); // 获取本机可用串口端口
            comboboxport.items.addrange(ports);
            comboboxport.selectedindex = comboboxport.items.count > 0 ? 0 : -1; // 有可用端口显示第一个

            comboboxbaudrate.text = "115200"; // 默认波特率
            comboboxdatabits.text = "8"; // 默认数据位:8
            comboboxstopbit.text = "1"; // 默认停止位:1
            comboboxcheck.text = "无"; // 默认无校验
        }

        /// <summary>
        /// 重写 系统消息函数
        /// </summary>
        /// <param name="m"></param>
        protected override void wndproc(ref message m)
        {
           
            base.wndproc(ref m);
        }

        /// <summary>
        /// 串口数据接收
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void serialport1_datareceived(object sender, system.io.ports.serialdatareceivedeventargs e)
        {
            int len = serialport1.bytestoread; // 获取可读字节数
            byte[] buff = new byte[len]; // 创建缓存数据数组
            serialport1.read(buff, 0, len); // 把数据读取到buff数组

            string str = encoding.default.getstring(buff); // byte值转ascii字符串

            invoke((new action(() => {
                if (checkboxhexshow.checked)
                {
                    textboxrecv.appendtext(bytetohexstr(buff));
                }
                else
                { 
                    textboxrecv.appendtext(str);                 
                }
            
            }))); // 对话框追加显示数据
        }


        public static string bytetohexstr(byte[] bytes)
        {
            string hexstr = "";
            try
            {
                if (bytes != null) {
                    for (int i = 0; i < bytes.length; i++)
                    {
                        hexstr += bytes[i].tostring("x2");
                        hexstr += " "; // 两个hex数值以空格隔开
                    }
                }

                return hexstr;
            }
            catch (exception)
            {
                return hexstr;
            }
        }

        /// <summary>
        /// 打开关闭串口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonportonoff_click(object sender, eventargs e)
        {
            if (buttonportonoff.text == "打开串口") {
                try
                {
                    serialport1.portname = comboboxport.text; // 获取选择的串口端口
                    serialportname = comboboxport.text;
                    serialport1.baudrate = int.parse(comboboxbaudrate.text); // 获取选择的波特率
                    serialport1.databits = int.parse(comboboxdatabits.text); // 获取选择的数据位

                    // 设置停止位
                    if (comboboxstopbit.text == "1") { serialport1.stopbits = stopbits.one; }
                    else if (comboboxstopbit.text == "1.5") { serialport1.stopbits = stopbits.onepointfive; }
                    else if (comboboxstopbit.text == "2") { serialport1.stopbits = stopbits.two; }

                    // 设置奇偶校验
                    if (comboboxcheck.text == "无") { serialport1.parity = parity.none; }
                    else if (comboboxcheck.text == "奇校验") { serialport1.parity = parity.even; }
                    else if (comboboxcheck.text == "偶校验") { serialport1.parity = parity.odd; }

                    // 打开串口
                    serialport1.open();
                    buttonportonoff.text = "关闭串口";

                }
                catch (exception ex)
                {
                    messagebox.show("串口打开失败"+ ex.tostring(), "警告",
                        messageboxbuttons.ok, messageboxicon.error);
                }
            }
            else
            {
                try
                {
                    serialport1.close();
                }
                catch (exception ex)
                { 
                
                }

                buttonportonoff.text = "打开串口"; 
            }
        }

        /// <summary>
        /// 清空接收数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonclearrecv_click(object sender, eventargs e)
        {
            textboxrecv.clear();
        }

        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonsenddata_click(object sender, eventargs e)
        {
            string str = textboxsend.text.tostring(); // 获取发送文本框里的数据
            try
            {
                if (str.length > 0) {
                    serialport1.write(str); // 串口发送数据
                }
            }
            catch (exception)
            { 
            
            }
        }

        /// <summary>
        /// 清除发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonclearsend_click(object sender, eventargs e)
        {
            textboxsend.clear();
        }

        private void comboboxport_selectedindexchanged(object sender, eventargs e)
        {

        }

        private void comboboxport_mouseclick(object sender, mouseeventargs e)
        {

        }
    }
}

窗体界面设计
在这里插入图片描述

运行效果
在这里插入图片描述

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com