C#串口通信源代码

界面

源码:下载

参考了以下两篇文章:

http://blog.csdn.net/geekwangminli/article/details/7851673

http://blog.csdn.net/wuyazhe/article/details/5598945

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.Ports;
using System.Text.RegularExpressions;

namespace 串口助手
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SerialPort sp = new SerialPort();

        private void Form1_Load(object sender, EventArgs e)
        {
            //获取所有串口名称
            string[] serialName = SerialPort.GetPortNames();
            foreach (string s in serialName)
            {
                //把串口名称添加到Combox
                cbSerialName.Items.Add(s);
            }
            //初始化设置,设置默认值
            cbSerialName.SelectedIndex = 0;
            cbBaudRate.SelectedIndex = 5;
            cbParity.SelectedIndex = 0;
            cbStop.SelectedIndex = 0;
            rb16Send.Select();
            rb16Rcv.Checked = true;
            cbDataBits.SelectedIndex = 3;
            Control.CheckForIllegalCrossThreadCalls = false;    //这个类中我们不检查跨线程的调用是否合法(因为.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程访问控件的属
            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
        }

        void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (sp.IsOpen)
            {
                //输出当前时间
                DateTime dt = DateTime.Now;
                textBoxRcv.Text += dt.GetDateTimeFormats(‘f‘)[0].ToString() + "\r\n";
                try
                {
                    Byte[] receivedData = new Byte[sp.BytesToRead];        //创建接收字节数组
                    sp.Read(receivedData, 0, receivedData.Length);         //读取数据,读取到receivedData中的是字符的ASCII码
                    sp.DiscardInBuffer();                                  //清空SerialPort控件的Buffer
                    //以字符串显示
                    if (rbStrRcv.Checked)
                    {
                        string strRcv = null;
                        for (int i = 0; i < receivedData.Length; i++)
                        {
                            strRcv += ((char)Convert.ToInt32(receivedData[i]));//把字节转换成整型,再强转成char
                        }
                        textBoxRcv.Text += strRcv + "\r\n";             //显示信息
                    }
                    //以16进制显示
                    if (rb16Rcv.Checked)
                    {
                        string strRcv = null;
                        //int decNum = 0;//存储十进制
                        for (int i = 0; i < receivedData.Length; i++)
                        {
                            strRcv += receivedData[i].ToString("X2");  //16进制显示
                        }
                        textBoxRcv.Text += strRcv + "\r\n";
                    }
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message, "出错提示");
                    textBoxSend.Text = "";
                }
            }
            else
            {
                MessageBox.Show("请打开某个串口", "错误提示");
            }
        }

        private void btnOpenSreial_Click(object sender, EventArgs e)      //打开串口 按钮
        {
            if (!sp.IsOpen)
            {
                try
                {
                    //串口号
                    string serialName = cbSerialName.SelectedItem.ToString();
                    sp.PortName = serialName;
                    sp.BaudRate = Convert.ToInt32(cbBaudRate.Text);   //波特率
                    sp.DataBits = Convert.ToInt32(cbDataBits.Text);   //数据位

                    switch (cbStop.Text)           //停止位
                    {
                        case "1":
                            sp.StopBits = StopBits.One;
                            break;
                        case "1.5":
                            sp.StopBits = StopBits.OnePointFive;
                            break;
                        case "2":
                            sp.StopBits = StopBits.Two;
                            break;
                        default:
                            break;
                    }

                    switch (cbParity.Text)             //校验位
                    {
                        case "无":
                            sp.Parity = Parity.None;
                            break;
                        case "奇校验":
                            sp.Parity = Parity.Odd;
                            break;
                        case "偶校验":
                            sp.Parity = Parity.Even;
                            break;
                        default:
                            break;
                    }

                    if (sp.IsOpen == true)   //如果是开着的,先关一下,再开,直接打开可能会出问题
                    {
                        sp.Close();
                    }

                    sp.Open();
                    btnOpenSreial.Text = "关闭串口";
                    //打开串口之后,把串口配置选项都禁用掉
                    cbSerialName.Enabled = false;
                    cbBaudRate.Enabled = false;
                    cbDataBits.Enabled = false;
                    cbParity.Enabled = false;
                    cbStop.Enabled = false;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show("Error:" + ex.Message, "Error");
                    return;
                }
            }
            else
            {
                //关闭串口
                sp.Close();
                btnOpenSreial.Text = "打开串口";
                //启用配置选项
                cbSerialName.Enabled = true;
                cbStop.Enabled = true;
                cbParity.Enabled = true;
                cbDataBits.Enabled = true;
                cbBaudRate.Enabled = true;
            }
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();  //退出按钮
        }

        private void btnClearSend_Click(object sender, EventArgs e)
        {
            textBoxSend.Text = "";   //清空发送数据文本框
        }

        private void btnClearRcv_Click(object sender, EventArgs e)
        {
            textBoxRcv.Text = "";  //清空接收数据文本框
        }

        private void btnSend_Click(object sender, EventArgs e)    //发送按钮
        {
            if (!sp.IsOpen)
            {
                MessageBox.Show("请先打开串口!!!");
                return;
            }

            string strSend = textBoxSend.Text;

            if (rb16Send.Checked)         //以16进制格式进行发送
            {
                string strBuf = strSend;
                string sendnoNull = strBuf.Trim();      //去掉空格
                string[] sendArray = strBuf.Split(‘ ‘);  //以空格分割

                byte[] b = new byte[sendArray.Length];
                //逐个将字符转为16进制字节数据
                for (int i = 0; i < sendArray.Length; i++)
                {
                    b[i] = Convert.ToByte(sendArray[i], 16);
                }

                sp.Write(b, 0, b.Length);
            }
            else              //以字符串格式发送
            {
                sp.WriteLine(textBoxSend.Text);
            }
        }

        private void textBoxSend_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (rb16Send.Checked == true)      //以16进制格式发送数据时,只能输入特定字符
            {
                //正则匹配
                string patten = "[0-9a-fA-F]|\b|0x|0X| "; //“\b”:退格键
                Regex r = new Regex(patten);
                Match m = r.Match(e.KeyChar.ToString());

                if (m.Success)//&&(txtSend.Text.LastIndexOf(" ") != txtSend.Text.Length-1))
                {
                    e.Handled = false;
                }
                else
                {
                    e.Handled = true;
                }
            }
            else
            {
                e.Handled = false;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            sp.Close();
        }
    }
}
时间: 2024-10-10 23:49:17

C#串口通信源代码的相关文章

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

51单片机GPIO口模拟串口通信

51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: 深入C语言(20) 作者同类文章X 1 #include "reg52.h" 2 #include "intrins.h" 3 #include "math.h" 4 #include "stdio.h" 5 sbit BT_SND =P1^5; 6 sbit

BluetoothChat用于蓝牙串口通信的修改方法

本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这里我使用的全部都是SPP-CA的默认模式.其中波特率是9600.读者若要修改其匹配密码,波特率等请使用串口调试工具对SPP-CA使用AT命令进行修改.详情参考其技术手册. 首先介绍Android端,官方的SDK中给了一个BluetoothChat的版本,这个版本稍加修改就可以进行串口通信.由于源代码

13.5 串口通信原理和控制程序

我们前边学串口通信的时候,比较注重的是串口底层时序上的操作过程,所以例程都是简单的收发字符或者字符串.在实际应用中,往往串口还要和电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制和逻辑关系,用来实现我们想要的结果. 本节所提供程序的功能是,通过电脑串口调试助手下发三个不同的命令,第一条指令:buzz on 可以让蜂鸣器响:第二条指令:buzz off 可以让蜂鸣器不响:第三条指令:showstr ,这个命令空格后边,可以

51单片机学习笔记【六】——串口通信实验

一.串口通信基础 1.串行通信 串行通信将数据字节分成一位一位的形式在一条传输线上逐个传送.单片机采用串行通信.特点是:传输线少,长距离传送成本低,但数据传送控制复杂. 串行通信的传输的传输方向:单工(数据传输只能沿一个方向),办双工(传输数据和接受数据分布进行),全双工(传输和接受同步进行). 单片机采用异步通信,发送和接受设备使用各自的时钟频率,容易实现,但传输效率不高,数据格式 2.MAX232 实验通过MAX232电平转换芯片,可把计算机串口电平(-12V~+12V)转换为单片及TTL电

Android串口通信(基于Tiny6410平台)

友善之臂的Android系统有他们自己编写的一个串口通信程序,网上没有找到他的源代码,而且界面操作不在一个界面,不是很方便,这里我自己写了一个粗糙点的串口通信程序. 同样这里还是调用友善之臂的friendlyarm-hardware.so库文件. 在Android工程文件下面加入com.friendlyarm.androidSDK包,在其下添加HardwareControler.java.下面我把我做的截图发上来. 主程序代码: package geekle.lab; import androi

Qt编写串口通信程序全程图文解说

(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们能够去 http://sourceforge.net/projects/qextserialport/files/ 进行下载,也能够去下载我上传到网上的: http://download.csdn.net/source/176278

Python的扩展接口[1] -&gt; 串口通信

串口通信 / Serial Communication 1 串口简介 / Serial Introduction 串行接口(Serial Interface)简称串口,通常为COM接口,数据发送方式为一位一位地顺序传送,通信线路简单,一对传输线即可实现双向通信,适用于远距离且传输速度慢的通信.其中最常用的也是标准接口为RS-232,除此之外还有RS-422,RS-485等. 2 pyserial环境搭建 Pyserial的安装可以通过pip进行,直接在命令行输入下列命令进行安装, pip ins

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type