为什么 Thread.Sleep() 在 SerialPort.Open 和 Close 之前?

2024-03-16

我注意到我在 SerialPort 关闭和打开时读到的示例代码,人们会在 SerialPort.Open() 和 Close() 之前添加 Thread.Sleep(1000)。就像下面这样:

Thread.Sleep(1000);
serialPort1.Open();
/* some code */
Thread.Sleep(1000);
serialPort1.Close();

我在任何地方都找不到任何解释。为什么人们在串口打开或关闭之前使用 Thread.Sleep 来阻塞它?是出于某种计时目的吗?每当我读取或写入串行端口时,我是否应该放置 Thread.Sleep ?


当您打开端口时,SerialPort 类会在后台启动一个新线程,该线程负责(通过 WaitCommEvent Windows API 函数)等待串行端口活动(例如数据到达)并向处理程序触发适当的事件。这就是为什么像 DataReceived 这样的事件实际上发生在辅助线程上。

当您关闭端口时,Close() 调用会立即返回,但辅助线程需要一些时间才能停止运行。

如果您在调用 Close 之后尝试过快地重新打开端口,并且线程尚未停止旋转,则 SerialPort 实例不处于可以开始新连接的状态。

请注意SerialPort.Close 的 MSDN 文档 http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.close.aspx states:

对于任何应用程序来说,最佳实践是等待一定时间 调用 Close 方法之后尝试调用 Open 之前的时间 方法,因为端口可能不会立即关闭。

您可以跟踪关闭端口的时间,并在再次打开端口之前确保已过了某个任意超时。

尽管需要记住一些怪癖,但在读/写之前不需要睡觉:

  • 读取返回的字节数少于您要求的字节数
  • 有时 DataReady 事件不会触发
  • ReadTimeout 可能有问题 http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/dc8f858c-8f6f-4184-aac6-02ac88dc5e77/

请记住,.NET BCL 中的 SerialPort 类仍然依赖于底层 Win32 API,并且我认为自最初实现以来它并没有得到 Microsoft 的太多喜爱。

欲了解更多信息,请参阅:

  • http://www.innovatic.dk/knowledg/SerialCOM/SerialCOM.htm#SerialPortEvents http://www.innovatic.dk/knowledg/SerialCOM/SerialCOM.htm#SerialPortEvents

  • http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f334ecce-eca3-46fd-8b65-27c02a1d4fea#10dae30d-bc75-49bb-a669-79399e58e1cc http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f334ecce-eca3-46fd-8b65-27c02a1d4fea#10dae30d-bc75-49bb-a669-79399e58e1cc

  • SerialPort 类偶尔会挂在 Dispose 上 https://stackoverflow.com/questions/10209090/serialport-class-occasionally-hangs-on-dispose

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Thread.Sleep() 在 SerialPort.Open 和 Close 之前? 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配

随机推荐