仪表发送矩形脉冲信号号,C#如何获取

C#怎样读取仪表数据?仪表数据是被动发送的,请高手回答_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
C#怎样读取仪表数据?仪表数据是被动发送的,请高手回答
我有更好的答案
问答式通信pc向串口发送数据---等待---仪表应答---pc串口有数据,接收----pc串口无数据,超时重发
采纳率:45%
为您推荐:
其他类似问题
等待您来回答您好,欢迎来到企汇网!
客服电话:400-
扫一扫有惊喜企汇网微信公众号
化工机械工控系统焊接紧固模具刀具道路养护包装印刷粮食油类生鲜水果畜牧种苗菌类水产绿化盆景农药化肥坚果果仁水暖五金家居装修施工材料橡胶塑料楼宇设施防水保温金属建材能源产品金属矿产有色金属非金属矿产工业润滑油板材卷材不锈钢材电工器材配电输电电气设备发电机组高压电器低压电器电动机工艺饰品节庆用品婚庆用品民间工艺数码礼品金银珠宝纪念收藏汽摩配件维护工具汽车改装车身附件汽车电器汽车内饰制动系统车辆分类仓储设备安全用品配件附件防护保养智能交通集装整理物流服务特种运输仓储配送船舶水运物流器材运输搬运起重装卸中介服务公关服务认证服务创意设计搬家服务房屋租赁维修服务
囧!很抱歉!您访问的页面不存在,或者已被删除。
您可能会喜欢
McAfee认证
中国电子商务诚信单位
青年文明号
Monitor的Wait和Pulse方法在线程的同步锁使用中是比较复杂的,理解稍微困难些,但也是内涵相当丰富和
微妙的!通过他们你可以自己实现AutoResetEvent,ManualResetEvent等同步对象,同时还会在效率和内存
使用上有个质的提高!
今天在MSDN查阅Monitor对象时,发现其下的成员方法的Demo都是用一个安全的同步Queue来阐述的,但是
代码注解和本身MSDN的专业术语晦涩难懂,造成这个实例并不是好理解,这里我将注释都添加到了关键语句上,
同时最后结合代码分析这个同步Queue是如何在Monitor的Wait和Pulse的指导下工作的:
现在我对整个代码做一个流程分析:
在这个特定背景下,线程优先顺序: 【等待队列】-&【就绪队列】-&【拥有锁线程】这个是重点,下文多
次会提到,其中的微妙关系的核心也来源于这个执行顺序。
MSDN官方备注:同步的对象包含若干引用,其中包括对当前拥有锁的线程的引用、对就绪队列的引
用和对等待队列的引用。
我的提醒:竞争对象锁的线程都是处于就绪队列中。
在本案例中我将FirstThread和SecondThread方法看成是A,B线程(这是完全可以的,因为A,B是两个线程的
回调函数都是同级的工作者线程),
下面是分析步骤:
/*情形1:假设A线程获取了m_smplQueue同步对象锁:
&* 1、开始循环,调用Monitor.Wait(m_smplQueue):A线程释放自己对同步对象的锁,流放自己到
等待队列(B线程一开始就竞争同步锁所以处于就绪队列中),直到自己再次获得锁,否则一直阻塞。
所以A线程运行到这里就暂停了。
&* 2、这时候B直接从就绪队列出来获得了m_smplQueue对象锁,Monitor.Pulse(m_smplQueue):执
行时,会将A线程放行到就绪队列,A准备获取对锁的拥有权。
&* 3、执行循环,Monitor.Wait(m_smplQueue, 1000):B线程将自己流放到等待队列并释放自身对
同步锁的独占,该等待设置了1S的超时值,当B线程在1S之内没有再次获取到锁则自动添加到就绪
队列,或者这期间收到Pulse的脉冲信号。
&* 4、B线程由于1S之内都返回false,lock块迅速结束,也即退出对m_smplQueue独占权,A由就绪
队列中进入对m_smplQueue的独占、继续.
&* 5、在1中陈述的Monitor.Wait(m_smplQueue)的阻塞结束,返回true,执行接下来的代码:
m_smplQueue.Enqueue(counter)向队列中加入元素,执行下一行的Monitor.Pulse(m_smplQueue),
由于第3条的1S没到(我相信地球上目前已没有这么慢的CPU了),B线程收到脉冲,将自己添加到就
绪队列,counter计数+1,A线程的lock结束,A则进入等待队列.
&* 6、由于B从就绪队列再次获得独占权,Monitor.Wait(m_smplQueue, 1000)返回true,while进入循
环内部,弹出第一条元素,打印出来。 调用Monitor.Pulse(m_smplQueue)将A线程加入到就绪队列,
同时while结束,lock块结束,B退出对对象锁的独占进入到等待队列中.
&* 7、A继续,遵循这个规律循环往复知道所有的数被打印出来...
&* 情形2:B线程先获取了m_smplQueue同步对象锁:
&* 1、进入lock块,Monitor.Pulse(m_smplQueue)执行:由于当前的A线程已经处于就绪队列
所以收到也没作用(那么你肯定再问那这句有什么用啊?没错是得问,你发现没如果是A线程开始是
否就有用了啊!这就是它的作用!).
&* 2、开始while (Monitor.Wait(m_smplQueue, 1000))中的判断,技术细节还是遵循上面所讲的,B这时
候会自动将自己流放到等待队列并在这里阻塞(也许1S到期了也会将它放置到就绪队列中去,这个作用
主要是防止死锁,因为咱们的就绪队列可不能为空啊,这在上面我忘了讲了这里补充下),于是乎A
获得了m_smplQueue独占权,于是乎又回到了上面从A先获得线程锁的流程....
&* 总之,这个操作目的是让多个线程操作一个Queue时,保持同步:不能在无数据时出队,一旦有
一个数据就马上可以出队,最终的效果是没有一个元素在队列中。
本文已收录于以下专栏:
相关文章推荐
Wait() 和 Pulse() 机制用于线程间交互。当在一个对象上使用Wait() 方法时,访问这个对象的线程就会一直等待直到被唤醒。Pulse() 和 PulseAll() 方法用来通知等待的线程...
有CSDN的朋友问一个问题,“Lock关键字不是有获取锁、释放锁的功能吗?...为什么还需要执行Pulse?”
也有朋友有些疑点,“用lock就不要用monitor了”,“Monitor.Wait完全...
例子1线程在初暂时中断运行时调用Wait()方法,这使得些线程暂时进入休眠状态并释放对象的锁以允许其它线程使用此对象,然后,当其它线程使用完锁对象调用Pulse()或PulseAll()时,唤醒休眠的...
sleep和wait都是使线程暂时停止执行的方法,但它们有很大的不同。
1. sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置。
而wait,它是使当前线程...
本文较为详细的分析了C#中sleep和wait的区别。分享给大家供大家参考。具体分析如下:
sleep和wait都是使线程暂时停止执行的方法,但它们有很大的不同。
①. sleep是线程类...
http://hillstone./_d.htmllock(x){  DoSomething();}这等效于:System.Object obj = (Sy...
首先lock和Minitor有什么区别呢?
其实lock在IL代码中会被翻译成Monitor。也就是Monitor.Enter(obj)和Monitor.Exit(obj).
lock(obj)
让我们首先看看MSDN对Monitor.Wait的解释(链接见注释):
释放对象上的锁并阻止当前线程,直到它重新获取该锁。...
该解释的确很粗糙,很难理解。让我们来看看它下面的备注:
同步的对象包...
这些疑问很自然。在大部分情况下,lock确实能基本达到我们要求资源同步的目的,加上配合其他同步工具,比如事件(AutoResetEvent)等的应用,日常工作中确实没有太多机会需要用到Monitor....
转自:/xugang/archive//1869818.html
这是一个旧瓶新装的话题。只是将我今日的所见所思予以实践和...
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)c# SerialPort控件串口通信 - 将飞 - 博客园
生命的意义在于记忆
c# SerialPort控件串口通信
现在大多数硬件设备均采用串口技术与计算机相连,因此串口的应用程序开发越来越普遍。例如,在计算机没有安装网卡的情况下,将本机上的一些信息数据 传输到另一台计算机上,那么利用串口通信就可以实现。运行本程序,在“发送数据”文本框中输入要传送的数据,单击【发送】按钮,将传送的数据发送到所选择 的端口号中;单击【接收】按钮,传递的数据被接收到“接收数据”文本框中。如图13.1所示。
在.NET Framework 2.0中提供了SerialPort类,该类主要实现串口数据通信等。下面主要介绍该类的主要属性(表13.1)和方法(表13.2)。
表13.1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& SerialPort类的常用属性
BaseStream
获取 SerialPort 对象的基础 Stream 对象
获取或设置串行波特率
BreakState
获取或设置中断信号状态
BytesToRead
获取接收缓冲区中数据的字节数
BytesToWrite
获取发送缓冲区中数据的字节数
获取端口的载波检测行的状态
CtsHolding
获取“可以发送”行的状态
获取或设置每个字节的标准数据位长度
DiscardNull
获取或设置一个值,该值指示 Null 字节在端口和接收缓冲区之间传输时是否被忽略
DsrHolding
获取数据设置就绪 (DSR) 信号的状态
获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号
获取或设置传输前后文本转换的字节编码
获取或设置串行端口数据传输的握手协议
获取一个值,该值指示 SerialPort 对象的打开或关闭状态
获取或设置用于解释 ReadLine( )和WriteLine( )方法调用结束的值
获取或设置奇偶校验检查协议
ParityReplace
获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节
获取或设置通信端口,包括但不限于所有可用的 COM 端口
ReadBufferSize
获取或设置 SerialPort 输入缓冲区的大小
ReadTimeout
获取或设置读取操作未完成时发生超时之前的毫秒数
ReceivedBytesThreshold
获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数
获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号
获取或设置每个字节的标准停止位数
WriteBufferSize
获取或设置串行端口输出缓冲区的大小
WriteTimeout
获取或设置写入操作未完成时发生超时之前的毫秒数
表13.2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& SerialPort类的常用方法
方 法 名 称
关闭端口连接,将 IsOpen 属性设置为False,并释放内部 Stream 对象
打开一个新的串行端口连接
从 SerialPort 输入缓冲区中读取
从 SerialPort 输入缓冲区中同步读取一个字节
从 SerialPort 输入缓冲区中同步读取一个字符
一直读取到输入缓冲区中的 NewLine 值
一直读取到输入缓冲区中指定 value 的字符串
已重载。将数据写入串行端口输出缓冲区
将指定的字符串和 NewLine 值写入输出缓冲区
注意:用跳线使串口的第2、3针连接,可以在本地计算机上实现串口通信,所以,通过串口的第2、3针的连接可以对程序进行检测。串口截面图如图13.2所示。
图13.2 串口截面图
(1)新建一个项目,命名为Ex13_01,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于执行发送数据和接受数据,添加两个TextBox控件,用于输入发送数据和显示接收数据。
(3)主要程序代码。
&&&&&&&& private void button1_Click(object sender, EventArgs e)
&&&&&&&& {
&&&&&&&&&&&& serialPort1.PortName = "COM1";
&&&&&&&&&&&& serialPort1.BaudRate = 9600;
&&&&&&&&&&&& serialPort1.Open();
&&&&&&&&&&&& byte[] data = Encoding.Unicode.GetBytes(textBox1.Text);
&&&&&&&&&&&& string str = Convert.ToBase64String(data);
&&&&&&&&&&&& serialPort1.WriteLine(str);
&&&&&&&&&&&& MessageBox.Show("数据发送成功!","系统提示");
&&&&&&&& }
&&&&&&&& private void button2_Click(object sender, EventArgs e)
&&&&&&&& {
&&&&&&&&&&&& byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
&&&&&&&&&&&& textBox2.Text = Encoding.Unicode.GetString(data);
&&&&&&&&&&&& serialPort1.Close();
&&&&&&&&&&&& MessageBox.Show("数据接收成功!","系统提示");
&&&&&&&& }
根据本实例,读者可以实现以下功能。
远程监控对方计算机屏幕。
&&& 下位机控制程序。
实例419 通过串口关闭对方计算机
在网络应用程序中,主要通过网卡实现数据的传输,因此可以利用套接字技术实现远程关闭计算机。如果计算机中没有安装网卡,该如何实现远程关闭计算机呢?本例实现了利用串口关闭对方计算机,程序运行结果如图13.3所示。
本实例使用SerialPort类的属性和方法,请参见实例“通过串口发送数据”。下面主要介绍SerialPort类的DataReceived 事件,DataReceived 事件为本实例的主要使用技术。DataReceived事件表示将处理 SerialPort 对象的数据接收事件的方法。串行接收事件可以由 SerialData 枚举中的任何项引起,是否引发此事件由操作系统决定,所以不一定会报告所有奇偶校验错误。
注意:本实例从开发到测试,都是由本地计算机完成的,用户只需要使用跳线将串口的第2、3针连接,可以在本地计算机上实现串口通信。跳线连接请参见图13.2。
(1)新建一个项目,命名为Ex13_02,默认窗体为Form1。
(2)在Form1窗体中,主要添加两个Button控件,分别用于打开通信串口和关闭对方计算机。
(3)主要程序代码。
&&&&&&&& private void button1_Click(object sender, EventArgs e)
&&&&&&&& {
&&&&&&&&&&&& //打开串口
&&&&&&&&&&&& serialPort1.PortName = "COM1";
&&&&&&&&&&&& serialPort1.Open();
&&&&&&&&&&&& button1.Enabled =
&&&&&&&&&&&& button2.Enabled =
&&&&&&&& }&&& //数据接收事件,等待接收关机命令
&&&&&&&& private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
&&&&&&&& {
&&&&&&&&&&&& byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
&&&&&&&&&&&& string str = Encoding.Unicode.GetString(data);
&&&&&&&&&&&& serialPort1.Close();
&&&&&&&&&&&& if (str == "关机")
&&&&&&&&&&&& {
&&&&&&&&&&&&&&&& Process p = new Process();
&&&&&&&&&&&&&&&& p.StartInfo.FileName = "cmd.exe";
&&&&&&&&&&&&&&&& p.StartInfo.UseShellExecute =
&&&&&&&&&&&&&&&& p.StartInfo.RedirectStandardInput =
&&&&&&&&&&&&&&&& p.StartInfo.RedirectStandardOutput =
&&&&&&&&&&&&&&&&& p.StartInfo.RedirectStandardError =
&&&&&&&&&&&&&&&& p.StartInfo.CreateNoWindow =
&&&&&&&&&&&&&&&& p.Start();
&&&&&&&&&&&&&&&& p.StandardInput.WriteLine("shutdown /s");
&&&&&&&&&&&&&&&& p.StandardInput.WriteLine("exit");
&&&&&&&&&&&& }
&&&&&&&& } //发送关机命令
&&&&&&&& private void button2_Click(object sender, EventArgs e)
&&&&&&&& {
&&&&&&&&&&&& if (button2.Text == "关闭计算机")
&&&&&&&&&&&& {
&&&&&&&&&&&&&&&& //发送关机命令数据
&&&&&&&&&&&&&&&& byte[] data = Encoding.Unicode.GetBytes("关机");
&&&&&&&&&&&&&&&& string str = Convert.ToBase64String(data);
&&&&&&&&&&&&&&&& serialPort1.WriteLine(str);
&&&&&&&&&&&&&&&& button2.Text = "取消关机";
&&&&&&&&&&&& }
&&&&&&&&&&&& else
&&&&&&&&&&&& {
&&&&&&&&&&&&&&&& button2.Text = "关闭计算机";
&&&&&&&&&&&&&&&& button1.Enabled =
&&&&&&&&&&&&&&&& button2.Enabled =
&&&&&&&&&&&&&&&& //取消关机
&&&&&&&&&&&&&&&& Process p = new Process();
&&&&&&&&&&&&&&&& p.StartInfo.FileName = "cmd.exe";
&&&&&&&&&&&&&&&& p.StartInfo.UseShellExecute =
&&&&&&&&&&&&&&&& p.StartInfo.RedirectStandardInput =
&&&&&&&&&&&&&&&&& p.StartInfo.RedirectStandardOutput =
&&&&&&&&&&&&&&&& p.StartInfo.RedirectStandardError =
&&&&&&&&&&&&&&&& p.StartInfo.CreateNoWindow =
&&&&&&&&&&&&&&&& p.Start();
&&&&&&&&&&&&&&&& p.StandardInput.WriteLine("shutdown /a");
&&&&&&&&&&&&&&&&& p.StandardInput.WriteLine("exit");
&&&&&&&&&&&& }
&&&&&&&& }
在我的测试软件中发现一个问题,就是当发送数据小于或等于8位时,一切正常,如果大于8为字节,则在datareceived事件中接收到的数据会分成两段,第一段为8位,第二段为剩下的字节,很奇怪,在msdn中讲到不能保证每次发送的数据都能正确接收到,需要参照BytesToRead属性来确定要读取的数据量,所以我想出来的解决办法为:
int DataLength=serialPort.BytesToR
StringBuilder sb=new StringBuilder();
while(i&DataLength)
&&& byte[] ds=new byte[1024];
&&& int len=serialPort.Read(ds,0,1024);
&&& sb.Append(Encoding.Ascii.GetString(ds,0,len));
Console.Write(sb,ToString());
这种奇怪的方法可以解决问题,后来想想应该是串口的工作方式决定的也有可能,期待其他的解决方式。
| 浏览(167) | &(0)
最近读者:
后,您就出现在这里。
发表评论:
*姓名最长为50字节
网址或邮箱:
©2008 Baiduc#使用ManagedWifi查看当前Wifi信号并选择wifi的示例
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了c#使用ManagedWifi查看当前Wifi信号并选择wifi的示例,需要的朋友可以参考下
使用ManagedWifi查看当前Wifi信号并选择wifi
代码如下:using Susing System.Collections.Gusing System.Lusing System.Tusing NativeW
namespace WifiExample{&&& class WifiManager&&& {&&&&&&& //CMCC的WIFISSID&&&&&&& public WIFISSID cmccWifiSSID;
&&&&&&& public WifiManager()&&&&&&& {&&&&&&&&&&& ScanSSID();&&&&&&& }
&&&&&&& /// &summary&&&&&&&& /// 将SSID转化成字符串&&&&&&& /// &/summary&&&&&&&& static string GetStringForSSID(Wlan.Dot11Ssid ssid)&&&&&&& {&&&&&&&&&&& return Encoding.UTF8.GetString(ssid.SSID, 0, (int)ssid.SSIDLength);&&&&&&& }
&&&&&&& /// &summary&& &&&&&&& /// 枚举所有无线设备接收到的SSID& &&&&&&& /// &/summary&& &&&&&&& public void ScanSSID()&&&&&&& {&&&&&&&&&&& WlanClient client = new WlanClient();&&&&&&&&&&& foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)&&&&&&&&&&& {&&&&&&&&&&&&&&& // Lists all networks with WEP security& &&&&&&&&&&&&&&& Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);&&&&&&&&&&&&&&& foreach (Wlan.WlanAvailableNetwork network in networks)&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& WIFISSID targetSSID = new WIFISSID();&&&&&&&&&&&&&&&&&&& targetSSID.wlanInterface = wlanI&&&&&&&&&&&&&&&&&&& targetSSID.wlanSignalQuality = (int)network.wlanSignalQ&&&&&&&&&&&&&&&&&&& targetSSID.SSID = GetStringForSSID(network.dot11Ssid);&&&&&&&&&&&&&&&&&&& targetSSID.dot11DefaultAuthAlgorithm = network.dot11DefaultAuthAlgorithm.ToString();&&&&&&&&&&&&&&&&&&& targetSSID.dot11DefaultCipherAlgorithm = network.dot11DefaultCipherAlgorithm.ToString();&&&&&&&&&&&&&&&&&&& Console.WriteLine(targetSSID.SSID);&&&&&&&&&&&&&&&&&&& if (targetSSID.SSID.ToLower().Equals("cmcc"))&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& cmccWifiSSID = targetSSID;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&& } // EnumSSID&
&&&&&&& /// &summary&& &&&&&&& /// 连接到CMCC &&&&&&& /// &/summary&& &&&&&&& /// &param name="ssid"&&/param&& &&&&&&& public void ConnectToCMCC()&&&&&&& {&&&&&&&&&&& // Connects to a known network with WEP security& &&&&&&&&&&& string profileName = cmccWifiSSID.SSID; // this is also the SSID&&&&&&&&&&& Console.WriteLine("profileName" + profileName);&&&&&&&&&&& cmccWifiSSID.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);&&&&&&& }
&&&&&&& /// &summary&& &&&&&&& /// 字符串转Hex& &&&&&&& /// &/summary&& &&&&&&& /// &param name="str"&&/param&& &&&&&&& /// &returns&&/returns&& &&&&&&& public static string StringToHex(string str)&&&&&&& {&&&&&&&&&&& StringBuilder sb = new StringBuilder();&&&&&&&&&&& byte[] byStr = System.Text.Encoding.Default.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)& &&&&&&&&&&& for (int i = 0; i & byStr.L i++)&&&&&&&&&&& {&&&&&&&&&&&&&&& sb.Append(Convert.ToString(byStr[i], 16));&&&&&&&&&&& }
&&&&&&&&&&& return (sb.ToString().ToUpper());&&&&&&& }
&&& } // Class WifiManager
&&& class WIFISSID&&& {&&&&&&& public string SSID = "NONE";&&&&&&& public string dot11DefaultAuthAlgorithm = "";&&&&&&& public string dot11DefaultCipherAlgorithm = "";&&&&&&& public bool networkConnectable =&&&&&&& public string wlanNotConnectableReason = "";&&&&&&& public int wlanSignalQuality = 0;&&&&&&& public WlanClient.WlanInterface wlanInterface =&&& }
调用链接CMCC===```WifiManager wm = new WifiManager();wm.ConnectToCMCC();
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 矩形脉冲信号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信