| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5885 人关注过本帖
标题:c# serialPort有没有人比较熟悉的,进来讨论下
只看楼主 加入收藏
ghl2312
Rank: 4
等 级:业余侠客
威 望:2
帖 子:208
专家分:226
注 册:2008-7-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:15 
c# serialPort有没有人比较熟悉的,进来讨论下
如题, serialPort有没有人比较熟悉的,进来讨论下,自由发挥,说说自己的见解
搜索更多相关主题的帖子: serialPort 
2009-10-14 16:32
ghl2312
Rank: 4
等 级:业余侠客
威 望:2
帖 子:208
专家分:226
注 册:2008-7-10
收藏
得分:0 
自己顶一下,大家不要谦虚。

向灰太狼学习
2009-10-14 17:57
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
收藏
得分:0 
SerialPort中串口数据的读取与写入有较大的不同。由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取。一、线程实时读串口;二、事件触发方式实现。
由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。
另外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现。如下:
 
程序代码:
SerialPort spSend;  //spSend,spReceive用虚拟串口连接,它们之间可以相互传输数据。spSend发送数据 
SerialPort spReceive;  //spReceive接受数据 
TextBox txtSend;  //发送区 
TextBox txtReceive;  //接受区 
Button btnSend;  //数据发送按钮 
delegate void HandleInterfaceUpdateDelegate(string text);  //委托,此为重点 
HandleInterfaceUpdateDelegate interfaceUpdateHandle; 
 
public void InitClient()  //窗体控件已在初始化 
{ 
  interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);  //实例化委托对象 
  spSend.Open();  //SerialPort对象在程序结束前必须关闭,在此说明 
  spReceive.DataReceived += Ports.SerialDataReceivedEventHandler(spReceive_DataReceived); 
  spReceive.ReceivedBytesThreshold = 1; 
  spReceive.Open(); 
} 
 
public void btnSend_Click(object sender,EventArgs e) 
{ 
  spSend.WriteLine(txtSend.Text); 
} 
 
public void spReceive_DataReceived(object sender,Ports.SerialDataReceivedEventArgs e) 
{ 
  byte[] readBuffer = new byte[spReceive.ReadBufferSize]; 
  spReceive.Read(readBuffer, 0, readBuffer.Length); 
  this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) }); 
} 
 
private void UpdateTextBox(string text) 
{ 
  txtReceive.Text = text; 
} 
  

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-10-14 18:55
ghl2312
Rank: 4
等 级:业余侠客
威 望:2
帖 子:208
专家分:226
注 册:2008-7-10
收藏
得分:0 
回复 3楼 jedypjd
如果用serialPort组建与硬件交互,会不会发生死锁的情况,或者说,如何把握(与硬件的交互时间和更新UI的时间)。

向灰太狼学习
2009-10-14 22:54
chengdou
Rank: 2
等 级:论坛游民
帖 子:9
专家分:10
注 册:2009-10-14
收藏
得分:0 
学习!
2009-10-15 13:55
thrunight
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2009-9-5
收藏
得分:0 
serial里的接收事件是异步处理的,重点就是在此,死锁问题不大会出现,但是如果数据量非常庞大,获取会对设备要求更高一些,毕竟 接收事件也需要CPU去处理,
2009-10-15 14:31
ghl2312
Rank: 4
等 级:业余侠客
威 望:2
帖 子:208
专家分:226
注 册:2008-7-10
收藏
得分:0 
考虑了下在关闭串口的时候是有可能发生死锁,从而造成死机的。
如果你的DeviceReceived事件没执行完,里面还有更新界面的操作。就会监听线程在等待,执行到界面操作,界面又要求关闭监听线程然后关闭串口。死锁了。

向灰太狼学习
2009-10-15 16:53
zhaoxili
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:327
专家分:479
注 册:2009-1-3
收藏
得分:20 
回复 楼主 ghl2312
串口通讯协议.rar (82.18 KB)


 楼主 建议你看看这个实例  我也在研究 初步看了看  挺不错的 是老外写的 国内修改的 呵呵  看看吧 有好处
2009-10-16 22:57
m37258887
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-10-18
收藏
得分:0 
想问问 C#串口想收发 汉字怎么 解决啊 ??大侠知道的话 短信我也行~
2009-10-18 10:13
ghl2312
Rank: 4
等 级:业余侠客
威 望:2
帖 子:208
专家分:226
注 册:2008-7-10
收藏
得分:0 
回复 8楼 zhaoxili
谢谢分享,最近被死锁折磨的

向灰太狼学习
2009-10-18 20:15
快速回复:c# serialPort有没有人比较熟悉的,进来讨论下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013099 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved