using System; 
 using System.Collections.Generic; 
 using System.ComponentModel; 
 using System.Data; 
 using System.Drawing; 
 using System.Text; 
 using System.Windows.Forms; 
 using System.IO.Ports; 
 using System.Threading; 
 namespace TestSerialPort 
 { 
     public partial class frmTESTSerialPort : Form 
     { 
         public frmTESTSerialPort() 
         { 
             InitializeComponent(); 
             Control.CheckForIllegalCrossThreadCalls = false; 
         } 
         private Button button1; 
         private TextBox txtSend; 
         private TextBox txtReceive; 
         private Label label1; 
         private Label label2; 
         /// <summary> 
         /// 必需的设计器变量。 
         /// </summary> 
         private System.ComponentModel.IContainer components = null; 
         /// <summary> 
         /// 清理所有正在使用的资源。 
         /// </summary> 
         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> 
         protected override void Dispose(bool disposing) 
         { 
             if (disposing && (components != null)) 
             { 
                 components.Dispose(); 
             } 
             base.Dispose(disposing); 
         } 
         #region Windows 窗体设计器生成的代码 
         /// <summary> 
         /// 设计器支持所需的方法 - 不要 
         /// 使用代码编辑器修改此方法的内容。 
         /// </summary> 
         private void InitializeComponent() 
         { 
             this.button1 = new System.Windows.Forms.Button(); 
             this.txtSend = new System.Windows.Forms.TextBox(); 
             this.txtReceive = new System.Windows.Forms.TextBox(); 
             this.label1 = new System.Windows.Forms.Label(); 
             this.label2 = new System.Windows.Forms.Label(); 
             this.SuspendLayout(); 
             // 
             // button1 
             // 
             this.button1.Location = new System.Drawing.Point(440, 379); 
             this.button1.Name = "button1"; 
             this.button1.Size = new System.Drawing.Size(75, 23); 
             this.button1.TabIndex = 0; 
             this.button1.Text = "发送"; 
             this.button1.UseVisualStyleBackColor = true; 
             this.button1.Click += new System.EventHandler(this.button1_Click); 
             // 
             // txtSend 
             // 
             this.txtSend.Location = new System.Drawing.Point(59, 12); 
             this.txtSend.Multiline = true; 
             this.txtSend.Name = "txtSend"; 
             this.txtSend.Size = new System.Drawing.Size(456, 164); 
             this.txtSend.TabIndex = 2; 
             // 
             // txtReceive 
             // 
             this.txtReceive.Location = new System.Drawing.Point(59, 200); 
             this.txtReceive.Multiline = true; 
             this.txtReceive.Name = "txtReceive"; 
             this.txtReceive.Size = new System.Drawing.Size(456, 164); 
             this.txtReceive.TabIndex = 2; 
             // 
             // label1 
             // 
             this.label1.Location = new System.Drawing.Point(13, 15); 
             this.label1.Name = "label1"; 
             this.label1.Size = new System.Drawing.Size(41, 12); 
             this.label1.TabIndex = 0; 
             this.label1.Text = "发送"; 
             // 
             // label2 
             // 
             this.label2.Location = new System.Drawing.Point(13, 213); 
             this.label2.Name = "label2"; 
             this.label2.Size = new System.Drawing.Size(41, 12); 
             this.label2.TabIndex = 0; 
             this.label2.Text = "接收"; 
             // 
             // frmTESTSerialPort 
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
             this.ClientSize = new System.Drawing.Size(546, 434); 
             this.Controls.Add(this.label2); 
             this.Controls.Add(this.label1); 
             this.Controls.Add(this.txtReceive); 
             this.Controls.Add(this.txtSend); 
             this.Controls.Add(this.button1); 
             this.Name = "frmTESTSerialPort"; 
             this.Text = "串口试验"; 
             this.ResumeLayout(false); 
             this.PerformLayout(); 
         } 
         #endregion 
 private void button1_Click(object sender, EventArgs e) 
         { 
             //实例化串口对象(默认:COMM1,9600,e,8,1)             
             SerialPort serialPort1 = new SerialPort(); 
             //更改参数 
             serialPort1.PortName = "COM1"; 
             serialPort1.BaudRate = 19200; 
             serialPort1.Parity = Parity.Odd; 
             serialPort1.StopBits = StopBits.Two; 
             //上述步骤可以用在实例化时调用SerialPort类的重载构造函数 
             //SerialPort serialPort = new SerialPort("COM1", 19200, Parity.Odd, StopBits.Two); 
             //打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改) 
             serialPort1.Open(); 
             //发送数据 
             SendStringData(serialPort1); 
             //也可用字节的形式发送数据 
             //SendBytesData(serialPort1); 
              
             //开启接收数据线程 
             ReceiveData(serialPort1); 
              
         } 
          
         //发送字符串数据 
         private void SendStringData(SerialPort serialPort) 
         { 
             serialPort.Write(txtSend.Text); 
         } 
         /// <summary> 
         /// 开启接收数据线程 
         /// </summary> 
         private void ReceiveData(SerialPort serialPort) 
         { 
             //同步阻塞接收数据线程 
             Thread threadReceive=new Thread(new ParameterizedThreadStart(SynReceiveData)); 
             threadReceive.Start(serialPort); 
              
              //也可用异步接收数据线程 
             //Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(AsyReceiveData)); 
             //threadReceiveSub.Start(serialPort); 
              
         } 
         //发送二进制数据 
         private void SendBytesData(SerialPort serialPort) 
         { 
             byte[] bytesSend=System.Text.Encoding.Default.GetBytes(txtSend.Text ); 
             serialPort.Write(bytesSend, 0, bytesSend.Length); 
         } 
         //同步阻塞读取 
         private void SynReceiveData(object serialPortobj) 
         { 
             SerialPort serialPort = (SerialPort)serialPortobj; 
             System.Threading.Thread.Sleep(0); 
             serialPort.ReadTimeout = 1000; 
             try 
             { 
                 //阻塞到读取数据或超时(这里为2秒) 
                 byte firstByte=Convert.ToByte(serialPort.ReadByte()); 
                 int bytesRead=serialPort.BytesToRead ;                
                 byte[] bytesData=new byte[bytesRead+1]; 
                 bytesData[0] = firstByte; 
                 for (int i = 1; i <=bytesRead; i++) 
                     bytesData = Convert.ToByte( serialPort.ReadByte()); 
                 txtReceive.Text = System.Text.Encoding.Default.GetString(bytesData); 
             } 
             catch(Exception e) 
             { 
                 MessageBox.Show(e.Message); 
                 //处理超时错误 
             } 
              
             serialPort.Close(); 
         } 
         //异步读取 
         private void AsyReceiveData(object serialPortobj) 
         { 
             SerialPort serialPort = (SerialPort)serialPortobj; 
             System.Threading.Thread.Sleep(500); 
             try 
             { 
                  txtReceive.Text =   serialPort.ReadExisting(); 
             } 
             catch (Exception e) 
             { 
                 MessageBox.Show(e.Message); 
                 //处理错误 
             } 
             serialPort.Close(); 
         } 
     } 
  
     static class Program 
     { 
         /// <summary> 
         /// 应用程序的主入口点。 
         /// </summary> 
         [STAThread] 
         static void Main() 
         { 
             Application.EnableVisualStyles(); 
             Application.SetCompatibleTextRenderingDefault(false); 
             Application.Run(new frmTESTSerialPort()); 
         } 
     } 
 }

SerialPort的更多相关文章

  1. SerialPort 串口开发

    private SerialPort sPort = new SerialPort(); //串行端口资源 /// <summary> /// 函数功能:打开串口/关闭串口 /// < ...

  2. C#SerialPort如何读取串口数据并显示在TextBox上

    SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...

  3. [注意]SerialPort操作PCI-1621D多串口卡,出现异常"参数不正确"

    开发LED大屏显示.40-20mA模拟量输出的时候,经常要与串口打交道.但是Windows自带的SerialPort串口操作组件貌似兼容性 不是太好,或是SerialPort本身有BUG,在操作PCI ...

  4. 对比SerialCommunication和微软的SerialPort,向SerialPort看齐

    SerialCommunication是我综合网上看到的代码稍作修改而成的串口通信类,而SerialPort则是C#的System类库的IO目录Ports子目录下的串口通信类.SerialCommun ...

  5. 如何通过SerialPort读取和写入设备COM端口数据

    SerialPort类用于控制串行端口文件资源.提供同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问.另外,SerialPort的功能可以包装在内部 Stream ...

  6. 使用SerialPort 读取外置GPS信息和使用GeoCoordinateWatcher获取内置gps的信息

    简介最近工作中需要读取gps设备的信息,平板本身有内置的gps设备,但是精度不够,就又添加了一个外置的gps.对于外置的gps,我们主要通过SerialPort类来获得串口的信息,然后对接收到的内容进 ...

  7. 记一次串口通信调试,慎用SerialPort.Close

    做项目是遇到了串口通信,真是遇到了一个大坑,不知道是微软的坑还是我的坑. 让我慢慢道来完整的经历. 项目中以前是vb 写的,是vb与vb 之间进行串口通信,现在改成C#和之前的vb程序进行串口通信. ...

  8. C# 通过SerialPort简单调用串口

    问题 最近比较经常使用串口进行发送以及传输数据,但是笔者在刚开始接触SerialPort类时,对于Write之后去Read数据的时候,由于设备上面还没有返回数据,读取到的只能是空值.然而,再进行下一次 ...

  9. [转]微软SerialPort秘籍[SerialPort为什么死锁程序的分析]

    既然是秘籍,显然是写一些大家不常找到的,MSDN里遗漏提示大家注意的东西. 用过.net 2.0中,自带SerialPort的人,大多都遇到过.莫名其妙的执行Close的时候会死掉的问题.而Wince ...

  10. 串行通讯之.NET SerialPort异步写数据

    目录 第1章说明    2 1 为什么需要异步写数据?    2 2 异步写数据的代码    2 3 源代码    4 第1章说明 1 为什么需要异步写数据? 如下图所示,以波特率300打开一个串口. ...

随机推荐

  1. [Exception] 当前 TransactionScope 已完成

    本文来自:http://www.cnblogs.com/loafer/archive/2010/06/03/TransactionScopeComplete.html 捕获异常的时候 经常会碰到这个异 ...

  2. [Python] 发送email的几种方式

    python发送email还是比較简单的,能够通过登录邮件服务来发送,linux下也能够使用调用sendmail命令来发送,还能够使用本地或者是远程的smtp服务来发送邮件,无论是单个,群发,还是抄送 ...

  3. UVA 12232 - Exclusive-OR(带权并查集)

    UVA 12232 - Exclusive-OR 题目链接 题意:有n个数字.一開始值都不知道,每次给定一个操作,I a v表示确认a值为v,I a b v,表示确认a^b = v,Q k a1 a2 ...

  4. LR性能测试应用

    上半个月,由于工作和上课两边跑,几乎没有属于自己的时间去做自己想做的事,在没有加班的一天晚上,我突然冲动地跑到图书馆借了一本书<LR性能测试应用>——姜艳. 我总喜欢看那些陈旧的书,因为在 ...

  5. SVN中tag branch trunk用法详解

    SVN中tag branch trunk用法详解 2010-05-24 18:32 佚名 字号:T | T 本文向大家简单介绍一下SVN中tag branch trunk用法,SVN中tag bran ...

  6. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  7. 教训:TOJ[4081] God Le wants to know the directory

    以前的字符串题本来就弱..2年不写就更弱了.嗯.留作教训 God Le is the most talented ACMer in the TJU-ACM team. When he wants to ...

  8. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  9. 杭电OJ—— 1084 What Is Your Grade?

    What Is Your Grade? Problem Description “Point, point, life of student!” This is a ballad(歌谣)well kn ...

  10. mysql事物处理

    mysql事物主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你既要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等.这样,这些数据库操作语句就构成一个事 ...