精华内容
下载资源
问答
  • c#串口通信程序
    2020-10-13 18:53:56

    前提
    C#要实现串口通信一定要创建一个Form

    源码及说明
    这是一个连接COM3串口,通过键盘摁键发出信息的基础程序(摁键对应小键盘的1,2,3)

    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
        {
            SerialPort sp1 = new SerialPort();
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Control.CheckForIllegalCrossThreadCalls = false;    //这个类中我们不检查跨线程的调用是否合法(因为.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程访问控件的属性)
                sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived);//接收到数据时的委托事件
                //sp1.ReceivedBytesThreshold = 1;
                //准备就绪              
                sp1.DtrEnable = true;
                sp1.RtsEnable = true;
                //设置数据读取超时为1秒
                sp1.ReadTimeout = 1000;
                sp1.Close();
    
                if (!sp1.IsOpen)
                {
                    sp1.PortName = "COM3";
                    sp1.BaudRate = 4800;       //波特率
                    sp1.DataBits = 8;       //数据位
                    sp1.StopBits = StopBits.One;
                    sp1.Parity = Parity.None;
                    if (sp1.IsOpen == true)//如果打开状态,则先关闭一下
                    {
                        sp1.Close();
                    }
                    sp1.Open();     //打开串口
                    judge.Text = "串口连接成功";
                }
            }
    
            //委托方法
            void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                byte[] byteRead = new byte[sp1.BytesToRead];    //BytesToRead:sp1接收的字符个数
                Byte[] receivedData = new Byte[sp1.BytesToRead];        //创建接收字节数组
                sp1.Read(receivedData, 0, receivedData.Length);         //读取数据
                sp1.DiscardInBuffer();                                  //清空SerialPort控件的Buffer
                string strRcv = null;
                for (int i = 0; i < receivedData.Length; i++) //窗体显示
                {
                    strRcv += receivedData[i].ToString("X2");  //16进制显示
                }
                receive.Text += strRcv + "\r\n";
            }
    
    
            void text_send(string send_str)
            {
                String strSend = send_str;
                string sendBuf = strSend;
                string sendnoNull = sendBuf.Trim();
                string sendNOComma = sendnoNull.Replace(',', ' ');    
                string sendNOComma1 = sendNOComma.Replace(',', ' '); 
                string strSendNoComma2 = sendNOComma1.Replace("0x", "");   
                strSendNoComma2.Replace("0X", "");   
                string[] strArray = strSendNoComma2.Split(' ');
                int byteBufferLength = strArray.Length;
                for (int i = 0; i < strArray.Length; i++)
                {
                    if (strArray[i] == "")
                    {
                        byteBufferLength--;
                    }
                }
    
                byte[] byteBuffer = new byte[byteBufferLength];
                int ii = 0;
                for (int i = 0; i < strArray.Length; i++)       
                {
                    Byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]);
                    int decNum = 0;
                    if (strArray[i] == "")
                    {
                        continue;
                    }
                    else
                    {
                        decNum = Convert.ToInt32(strArray[i], 16); 
                    }
                        byteBuffer[ii] = Convert.ToByte(decNum);
                    ii++;
                }
                sp1.Write(byteBuffer, 0, byteBuffer.Length);
            }
    
            private void Form1_KeyUp(object sender, KeyEventArgs e)
            {
                switch(e.KeyValue)
                {
                    case 97: text_send("01"); break;
                    case 98: text_send("02"); break;
                    case 99: text_send("03"); break;
                    default:text_send("04");break;
                }
            }
        }
    }
    
    
    更多相关内容
  • C#串口通信程序

    2018-03-13 11:08:11
    C#编写的串口通信程序
  • C#编写的用ASCII码发送的串口通信程序
  • 创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类。 创建C#串口通信程序之创建SerialPort 对象 通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程。 我们将要用到的...
  • 这是一个我写的用C#实现串口通信程序,可以扫描串口,然后选择串口,打开串口之后,如果打开成功,打开串口旁边的方框会变绿,这个可以验证是否成功打开,打开串口旁边还有关闭串口命令。 打开串口之后,在发送的...
  • C#串口通讯程序

    2018-04-03 15:33:02
    1、C#串口通讯程序 2、代码清晰、有注释 3、参数配置功能齐全 4、适合初学者
  • C#串口通信程序 教程 源代码.,用这些代码就可以做上上位机.......................................................
  • 1.)启动程序打开串口通信,接受嵌入式校牌发送过来的16进制形式的数据指令执行业务操作,业务操作完做出回应。 2.)根据需要设置串口通信的必要参数。 3.)通过校牌指令执行相关业务,拉取数据通过访问java的http...
  • C#串口介绍以及简单串口通信程序设计实现 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍  串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是...
  • 串行接口简称串口(Serial Interface),也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现...

    一、简介

    串行接口简称串口(Serial Interface),也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

    C#串口介绍及串口通信程序设计实现(附程序分享)

    9位针脚功能对应如下:

    1.  载波检测(DCD)
    2.  接受数据(RXD)
    3.  发出数据(TXD)
    4.  数据终端准备好(DTR)
    5.  信号地线(SG)
    6.  数据准备好(DSR)
    7.  请求发送(RTS)
    8.  清除发送(CTS)
    9.  振铃指示(RI)

    二、串口应用

    工业领域使用较多,比如:数据采集,设备控制等等,好多都是用串口通信来实现!比如国家电表的通信接口就是串口通信。上述9针脚接口中,我们一般只接出RXD TXD两针,外加GND,即可实现两台设备之间的串口通信。

    C#串口介绍及串口通信程序设计实现(附程序分享)

    三、串口通信协议

    C#串口介绍及串口通信程序设计实现(附程序分享)

    空闲位:

    UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。

    起始位:

    每开始一次通信时发送方先发出一个逻辑”0”的信号(低电平),表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。

    数据位:

    起始位之后就是我们所要传输的数据,数据位可以是5、6、7、8,9位等,构成一个字符(一般都是8位)。如ASCII码(7位),扩展BCD码(8位)。先发送最低位,最后发送最高位,使用低电平表示‘0’高电平表示‘1’完成数据位的传输。

    奇偶校验位:

    数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位其实是调整个数,串口校验分几种方式:

    • 1、无校验(no parity)。
    • 2、奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。
    • 3、偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。
    • 4、mark parity:校验位始终为1(不常用)。
    • 5、parity:校验位始终为0(不常用)。

    停止位:

    它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。

    波特率:

    数据传送速率用波特率来表示,单位bps(bits per second),即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us。

    四、C#程序设计

    1. 首先在VS中建立Windows窗口程序;
    2. 串口通信程序中首先设置串口相关必要信息,包括:串口号,波特率,数据位,停止位,校验位等,以及接受与发送的数据量Rx与Tx。基本逻辑是:打开软件后,首先获取现在存在的串口号,添加至串口号选择栏的下拉项目中:
    rivate void comboBox_Port_Update()
    {
    RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm"); //需要调用Win32
    if(keyCom != null)
    {
    string[] sSubKeys = keyCom.GetValueNames();
    foreach(string sName in sSubKeys )
    {
    string sValue = (string)keyCom.GetValue(sName);
    comboBox1.Items.Add(sValue );
    }
    }
    }

    3. 添加发送和接收项目,并且设置发送按钮与清除接收消息框的清除按钮:

    C#串口介绍及串口通信程序设计实现(附程序分享)

    4. 测试各项功能,以及调试bug。需要考虑这些情况:

    (1)串口还没打开就发送数据,需要弹出警告框提示串口还未打开:

    C#串口介绍及串口通信程序设计实现(附程序分享)

    (2)发送栏的参数还没设置完整,就点击发送按钮:

    C#串口介绍及串口通信程序设计实现(附程序分享)

    还有一些设计交互逻辑,在慢慢测试中就会发现,在此不再一一列举。有需要程序源代码的同学私信我,或者不介意的话可以加微信estorm22交流。

    程序源码见我的github:https://github.com/chengoes/SerialPort


    硬件之家,技术向前。

    展开全文
  • 015.用VS2017_C#串口通信程序设计源码
  • COM(C#串口通信程序实例)

    热门讨论 2010-04-17 14:53:43
    COM(C#串口通信程序实例)COM(C#串口通信程序实例)COM(C#串口通信程序实例)COM(C#串口通信程序实例)
  • C#串口通信程序..pdf

    2020-09-16 10:12:42
    2010 串口通信程序 用 VC#2008实现 实现检测那些串口是可用的 实现对串口的读写操作 彭军 利达光电股份有限公司 2010/4/23 2010 年 4 月 串口通信程序 23 日 利 达 光 电 股 份 有 限 公 司 | 彭 军 2 2010 年 4 月 ...
  • 资源名:c#与485MODBUS接口的PLC进行串口通信程序源码 资源类型:程序源代码 源码说明: c#与485MODBUS串口通信源代码,通过串口读取设备数据,c#的源代码,比如读取PLC数据(AD采集的或设置的),可以控制PLC...
  • C# 串口通信Winfrom 程序,检测串口 发送和接收消息 亲测可用
  • C# 串口通讯程序

    2014-09-24 09:34:22
    简单的串口通讯程序,能够以10进制、16进制、以及ASCII形式发送和接收数据
  • C#串口通信程序源代码,程序功能与串口助手类似,可以直接运行,其中MySerialPort.cs是自己编写的串口通信类,可以拷贝到其他程序中直接调用。
  • C#串口通讯程序代码

    2017-10-27 23:18:36
    C#串口通讯程序,方便调试,欢迎共享使用。
  • C#串口通讯详细教程是每位初学者的参考资料。。。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,626
精华内容 2,650
关键字:

c#串口通信程序