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


    做项目是遇到了串口通信,真是遇到了一个大坑,不知道是微软的坑还是我的坑。

    让我慢慢道来完整的经历。

    项目中以前是vb 写的,是vb与vb 之间进行串口通信,现在改成C#和之前的vb程序进行串口通信。

    改成C#之后发现通信总有一段乱码,,之前的vb也没有这样的问题。思前想后总共也就那几句代码实在想不去哪里的问题。

    调试也不知从何下手。最后下载了一个串口调试工具进行调试,发现明明应该8秒钟发一次请求,结果几乎每隔一秒左右就发送一次请求。

    每次发送的都是一个未知字符。让我实在是想不出哪里的问题。大致代码如下。

    1             SerialPort port = new SerialPort("COM1");
    2             port.BaudRate = 57600;
    3             port.DataBits = 8;
    4             port.Parity = Parity.None;
    5             port.StopBits = StopBits.One;
    6             if (!port.IsOpen)
    7                 port.Open();
    8             port.Write("ceshi");
    9             port.Close();

    总共就这么几句代码,实在想不出哪里的问题,这个是在timer事件里执行的。

    调试也是8秒钟进入一次代码。那在哪里会发生每秒发送一次信息呢?

    调了各种通讯波段不行,加了各种代码过滤还是不知所以然。

    最后尝试注释掉close,结果就神奇的没有每次通讯。这样也就没有出现乱码。

    最后的坑居然是这句话 port.Close(); 真是怎么都没有想到。

    SerialPort.Close 方法

    http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.close(v=vs.110).aspx

    根据微软的解释,调用此方法会关闭 SerialPort 对象并清除接收缓冲区和传输缓冲区。

    结合1楼 close会传输缓冲区,这样应该只会有一次,为何还会每隔一段时间产生通信?

    建议:COM口打开后没必要刻意去关闭,直接等到程序退出的时候关闭就可以了,对通信没有任何影响。

  • 相关阅读:
    xshell的优化和连接
    系统安装后的linux和vmware的网络配置
    CentOS安装系统安装完成
    最快让你上手ReactiveCocoa之进阶篇
    最快让你上手ReactiveCocoa之基础篇
    提升自己逼格的编程之美之代码规范
    告别2016迎接2017,分享一些第三方插件
    Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性
    ReactiveCocoa 5.0 初窥:可能是最痛的一次升级
    react+antd+select+lodash模糊搜索防抖
  • 原文地址:https://www.cnblogs.com/linezero/p/3953371.html
Copyright © 2020-2023  润新知