📄 serialport定时操作例程.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>SerialPort定时操作例程 - 纹£祥 的专栏 - CSDNBlog</title>
<meta content=".Text" name="GENERATOR" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<div id="top">
<div id="main">
<div class="post"> <div class="postTitle">
SerialPort定时操作例程</a> </div> <div class="postText"> <p>这是SerialPort定时操作例程,以两种方式接收数据,异步方式接收数据至少需要500ms,同步方式1S超时.</p><p>这里没有考虑信息完整性的处理,接收信息的完整性包括你需预先知道接收字节的长度或结尾处的字节。</p><p>对于长度的完整性,你可以用同步方式接收数据,在从线程用serialPort.BytesToRead 判断累计接收字节的长度.</p><p>对于预先知道结尾处字节的完整性,你可以用serialPort.<span class="identifier">ReadTo</span> (<mshelp:link xmlns:mshelp="http://msdn.microsoft.com/mshelp" keywords="T:System.String">string</mshelp:link> <span class="parameter">value)方法读取数据(value为结尾处的字符串)</span></p><p><span class="parameter">对于长度和结尾处字节不能确定信息的完整性处理,我的一种方法是用异步的方式,这种方法需事先估计出接收对方信息所需的时间,将此时间设置为从线程睡眠的时间。另一种方法是用同步方式接收,当SerialPort.ReadByte()方法阻塞到接收到初始始数据后,从线程每次睡眠一个短暂的时间,用serialPort.BytesToRead ==0判断有无新数据.若有新数据,从线程继续睡眠;若没有新数据到来,说明数据是完整的。</span></p><p><span class="parameter">当然数据完整接收后,仍要用接收数据的协议(头、尾字节、校验等方式)判断数据的正确性,保证数据真正是完整的。</span></p><p><span class="parameter">我下次将编写一个基于事件DataReceived (如同VB的OnComm事件)的代码例程。</span></p><p><span class="parameter">文章有不妥之处欢迎指正。</span></p><p><span class="parameter"></span></p><p><span class="parameter"></span></p><p><测试程序时请将计算机串口的2、3脚短路,自发自收></p><p>using System;<br />using System.Collections.Generic;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Drawing;<br />using System.Text;<br />using System.Windows.Forms;<br />using System.IO.Ports;<br />using System.Threading;</p><p>namespace TestSerialPort<br />{<br /> public partial class frmTESTSerialPort : Form<br /> {<br /> public frmTESTSerialPort()<br /> {<br /> InitializeComponent();<br /> Control.CheckForIllegalCrossThreadCalls = false;<br /> }</p><p> private Button button1;<br /> private TextBox txtSend;<br /> private TextBox txtReceive;<br /> private Label label1;<br /> private Label label2;</p><p> /// <summary><br /> /// 必需的设计器变量。<br /> /// </summary><br /> private System.ComponentModel.IContainer components = null;</p><p> /// <summary><br /> /// 清理所有正在使用的资源。<br /> /// </summary><br /> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param><br /> protected override void Dispose(bool disposing)<br /> {<br /> if (disposing && (components != null))<br /> {<br /> components.Dispose();<br /> }<br /> base.Dispose(disposing);<br /> }</p><p> #region Windows 窗体设计器生成的代码</p><p> /// <summary><br /> /// 设计器支持所需的方法 - 不要<br /> /// 使用代码编辑器修改此方法的内容。<br /> /// </summary><br /> private void InitializeComponent()<br /> {<br /> this.button1 = new System.Windows.Forms.Button();<br /> this.txtSend = new System.Windows.Forms.TextBox();<br /> this.txtReceive = new System.Windows.Forms.TextBox();<br /> this.label1 = new System.Windows.Forms.Label();<br /> this.label2 = new System.Windows.Forms.Label();<br /> this.SuspendLayout();<br /> // <br /> // button1<br /> // <br /> this.button1.Location = new System.Drawing.Point(440, 379);<br /> this.button1.Name = "button1";<br /> this.button1.Size = new System.Drawing.Size(75, 23);<br /> this.button1.TabIndex = 0;<br /> this.button1.Text = "发送";<br /> this.button1.UseVisualStyleBackColor = true;<br /> this.button1.Click += new System.EventHandler(this.button1_Click);<br /> // <br /> // txtSend<br /> // <br /> this.txtSend.Location = new System.Drawing.Point(59, 12);<br /> this.txtSend.Multiline = true;<br /> this.txtSend.Name = "txtSend";<br /> this.txtSend.Size = new System.Drawing.Size(456, 164);<br /> this.txtSend.TabIndex = 2;<br /> // <br /> // txtReceive<br /> // <br /> this.txtReceive.Location = new System.Drawing.Point(59, 200);<br /> this.txtReceive.Multiline = true;<br /> this.txtReceive.Name = "txtReceive";<br /> this.txtReceive.Size = new System.Drawing.Size(456, 164);<br /> this.txtReceive.TabIndex = 2;<br /> // <br /> // label1<br /> // <br /> this.label1.Location = new System.Drawing.Point(13, 15);<br /> this.label1.Name = "label1";<br /> this.label1.Size = new System.Drawing.Size(41, 12);<br /> this.label1.TabIndex = 0;<br /> this.label1.Text = "发送";<br /> // <br /> // label2<br /> // <br /> this.label2.Location = new System.Drawing.Point(13, 213);<br /> this.label2.Name = "label2";<br /> this.label2.Size = new System.Drawing.Size(41, 12);<br /> this.label2.TabIndex = 0;<br /> this.label2.Text = "接收";<br /> // <br /> // frmTESTSerialPort<br /> // <br /> this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);<br /> this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;<br /> this.ClientSize = new System.Drawing.Size(546, 434);<br /> this.Controls.Add(this.label2);<br /> this.Controls.Add(this.label1);<br /> this.Controls.Add(this.txtReceive);<br /> this.Controls.Add(this.txtSend);<br /> this.Controls.Add(this.button1);<br /> this.Name = "frmTESTSerialPort";<br /> this.Text = "串口试验";<br /> this.ResumeLayout(false);<br /> this.PerformLayout();</p><p> }</p><p> #endregion</p><p> private void button1_Click(object sender, EventArgs e)<br /> {<br /> //实例化串口对象(默认:COMM1,9600,e,8,1) <br /> SerialPort serialPort1 = new SerialPort();<br /> //更改参数<br /> serialPort1.PortName = "COM1";<br /> serialPort1.BaudRate = 19200;<br /> serialPort1.Parity = Parity.Odd;<br /> serialPort1.StopBits = StopBits.Two;</p><p> //上述步骤可以用在实例化时调用SerialPort类的重载构造函数<br /> //SerialPort serialPort = new SerialPort("COM1", 19200, Parity.Odd, StopBits.Two);</p><p> //打开串口(打开串口后不能修改端口名,波特率等参数,修改参数要在串口关闭后修改)<br /> serialPort1.Open();</p><p> //发送数据<br /> SendStringData(serialPort1);<br /> //也可用字节的形式发送数据<br /> //SendBytesData(serialPort1);<br /> <br /> //开启接收数据线程<br /> ReceiveData(serialPort1);<br /> <br /> }</p><p> </p><p> //发送字符串数据<br /> private void SendStringData(SerialPort serialPort)<br /> {<br /> serialPort.Write(txtSend.Text);<br /> }</p><p> /// <summary><br /> /// 开启接收数据线程<br /> /// </summary><br /> private void ReceiveData(SerialPort serialPort)<br /> {<br /> //同步阻塞接收数据线程<br /> Thread threadReceive=new Thread(new ParameterizedThreadStart(SynReceiveData));<br /> threadReceive.Start(serialPort);<br /> <br /> //也可用异步接收数据线程<br /> //Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(AsyReceiveData));<br /> //threadReceiveSub.Start(serialPort);<br /> <br /> }</p><p> //发送二进制数据<br /> private void SendBytesData(SerialPort serialPort)<br /> {<br /> byte[] bytesSend=System.Text.Encoding.Default.GetBytes(txtSend.Text );<br /> serialPort.Write(bytesSend, 0, bytesSend.Length);<br /> }</p><p> //同步阻塞读取<br /> private void SynReceiveData(object serialPortobj)<br /> {<br /> SerialPort serialPort = (SerialPort)serialPortobj;<br /> System.Threading.Thread.Sleep(0);<br /> serialPort.ReadTimeout = 1000;<br /> try<br /> {<br /> //阻塞到读取数据或超时(这里为2秒)<br /> byte firstByte=Convert.ToByte(serialPort.ReadByte());<br /> int bytesRead=serialPort.BytesToRead ; <br /> byte[] bytesData=new byte[bytesRead+1];<br /> bytesData[0] = firstByte;<br /> for (int i = 1; i <=bytesRead; i++)<br /> bytesData[i] = Convert.ToByte( serialPort.ReadByte());<br /> txtReceive.Text = System.Text.Encoding.Default.GetString(bytesData);<br /> }<br /> catch(Exception e) <br /> {<br /> MessageBox.Show(e.Message);<br /> //处理超时错误<br /> }<br /> <br /> serialPort.Close();</p><p> }</p><p> //异步读取<br /> private void AsyReceiveData(object serialPortobj)<br /> {<br /> SerialPort serialPort = (SerialPort)serialPortobj;<br /> System.Threading.Thread.Sleep(500);<br /> try<br /> {<br /> txtReceive.Text = serialPort.ReadExisting();<br /> }<br /> catch (Exception e)<br /> {<br /> MessageBox.Show(e.Message);<br /> //处理错误<br /> }<br /> serialPort.Close();<br /> }</p><p> }</p><p><br /> static class Program<br /> {<br /> /// <summary><br /> /// 应用程序的主入口点。<br /> /// </summary><br /> [STAThread]<br /> static void Main()<br /> {<br /> Application.EnableVisualStyles();<br /> Application.SetCompatibleTextRenderingDefault(false);<br /> Application.Run(new frmTESTSerialPort());<br /> }<br /> }</p><p>} </p><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1123379 </p><br><br><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1437196</p> <br> </div> <div class="postFoot"> <script src="http://localhost:82/PromoteIcon.aspx?id=1437196"></script> [<a href="JavaScript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();" title="功能强大的网络收藏夹,一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐" >收藏到我的网摘</a>] 纹£祥发表于 2006年12月10日 13:39:00 </div></div><link rel="pingback" href="http://blog.csdn.net/blackvii/Services/Pingback.aspx" /><!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://blog.csdn.net/blackvii/archive/2006/12/10/1437196.aspx"dc:identifier="http://blog.csdn.net/blackvii/archive/2006/12/10/1437196.aspx"dc:title="SerialPort定时操作例程"trackback:ping="http://tb.blog.csdn.net/TrackBack.aspx?PostId=1437196" /></rdf:RDF>--><script>function hide(){hideComment();}</script><br><div class="post"><div class="postTitle">相关文章:</div><ul class='postText'><li><a target='_blank' href='http://blog.csdn.net/veryhappy/archive/2006/04/05/651949.aspx'>利用SerialPort类实现收发短信(C# 2.0)</a> 2006-04-05 <a target='_blank' href='http://blog.csdn.net/veryhappy/'>veryhappy</a></li><li><a target='_blank' href='http://blog.csdn.net/sinboy/archive/2005/12/09/548158.aspx'>在Java中操作串口实现短信收发</a> 2005-12-09 <a target='_blank' href='http://blog.csdn.net/sinboy/'>sinboy</a></li><li><a target='_blank' href='http://blog.csdn.net/yangjundeng/archive/2005/03/08/314921.aspx'>C#异步数据接收串口操作类</a> 2005-03-08 <a target='_blank' href='http://blog.csdn.net/yangjundeng/'>yangjundeng</a></li><li><a target='_blank' href='http://blog.csdn.net/jenshy/archive/2006/04/26/678075.aspx'>Java串行端口通讯技术慨论 </a> 2006-04-26 <a target='_blank' href='http://blog.csdn.net/jenshy/'>jenshy</a></li><li><a target='_blank' href='http://blog.csdn.net/wxyxl/archive/2001/05/05/2615.aspx'>利用Java实现串口全双工通讯</a> 2001-05-05 <a target='_blank' href='http://blog.csdn.net/wxyxl/'>wxyxl</a></li></ul></div><br />
<br />
<div id="csdn_zhaig_ad_yahoo" class="post" ></div>
<span id="Anthem_Comments.ascx_ltlComments__"><span id="Comments.ascx_ltlComments"><br>
<div id="comments">
<h3></h3>
没有评论。
</div>
</span></span>
<script language="javascript">
ad_width=468;
ad_height=60;
adcss=2;
unionuser=19;
ad_type='j';
count=5;
</script>
<script language="javascript" src="http://tagegg.csdn.net/showads.js" type="text/javascript"></script>
<script language="javascript" src="/js/showgm.js" type="text/javascript"></script>
<script type="text/javascript">document.write("<img src=http://counter.csdn.net/pv.aspx?id=24 border=0 width=0 height=0>");</script>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -