最近写C#串口通信程序,系统是B/S架构。SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用(不支持多线程调用)。

一、Machine类

1、Machine类有一个静态变量,定义如下:

private static SerialPort serialPort = null;

2、向串口发送数据,同步接收返回数据的方法:

/// <summary>
/// 向串口发送数据,读取返回数据
/// </summary>
/// <param name="sendData">发送的数据</param>
/// <returns>返回的数据</returns>
private byte[] ReadPort(byte[] sendData)
{if (serialPort == null){serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.ReadBufferSize = 1024;serialPort.WriteBufferSize = 1024;}if (!serialPort.IsOpen){serialPort.Open();}//发送数据serialPort.Write(sendData, 0, sendData.Length);//读取返回数据while (serialPort.BytesToRead == 0){Thread.Sleep(1);}Thread.Sleep(50); //50毫秒内数据接收完毕,可根据实际情况调整byte[] recData = new byte[serialPort.BytesToRead];serialPort.Read(recData, 0, recData.Length);return recData;
}

3、发送联机指令:

/// <summary>
/// 联机
/// </summary>
/// <returns>联机成功或失败</returns>
public bool Connect(out string msg)
{byte[] sendData = new byte[] { 0x01, 0x01, 0x00, 0x00 };CommonUtil.CalCheckCode(sendData);byte[] recData = ReadPort(sendData);if (recData.Length >= 4&& recData[0] == 0x01&& recData[1] == 0x02&& recData[2] == 0x00&& CommonUtil.ValidCheckCode(recData)){switch (recData[3]){case 0x00:msg = "控制主板正在重启";return false;case 0x01:msg = "联机成功";return true;case 0x02:msg = "控制主板正在维护";return false;case 0x03:msg = "控制主板收到的数据格式不正确";return false;default:msg = "未知状态";return false;}}else{msg = "货机返回的数据格式不正确";return false;}
}

二、如何使用,这里是在C/S程序中测试,在B/S程序中也可以正常使用,下面是窗体Form1类中的代码:

1、定义对象及初始化

private Machine machine = null;public Form1()
{InitializeComponent();machine = new Machine();
}

2、联机事件

//联机
private void btnConnect_Click(object sender, EventArgs e)
{string msg = null;if (machine.Connect(out msg)){MessageBox.Show("成功:" + msg);}else{MessageBox.Show("失败:" + msg);}
}

C#串口通信-向串口发送数据,同步接收返回数据相关推荐

  1. C#串口通信—向串口发送数据,同步接收返回数据

    最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接 ...

  2. MFC串口通信设置及发送、中断接收程序

    前一段做了个串口通信小软件,就是现实利用上位机软件通过串口通信对下位机(单片机)通信,校时LED点阵万年历,省去按键调节的麻烦,方便校时,省时省力. 为右击 串口通信控件,添加关联控件变量CMSCom ...

  3. linux串口发送键值,c51:串口通信,按键发送字符串

    原标题:c51:串口通信,按键发送字符串 一.程序功能 1.实现0-f的16位键盘输入功能,将键值由P1口输出. 2.不同的键值串口发送不同的 二.代码 //函数功能 //1.实现0~f的16位键盘功 ...

  4. android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例

    Qt串口通信开发之QSerialPort模块详细使用方法与实例 发布时间:2020-10-23 12:19:05 来源:脚本之家 阅读:111 作者:沧海一笑-dj Qt串口通信基础及名词说明 串口通 ...

  5. 树莓派串口通信 USB串口通信 常用串口命令

    树莓派串口通信 USB串口通信 文章目录 树莓派串口通信 USB串口通信 准备 发送数据 接收数据 如果不知道树莓派怎么使用USB串口通信的,欢迎浏览我的另一篇博客文章: 树莓派使用USB串口通信 C ...

  6. Java串口通信读写串口导致程序崩溃问题

    最近心血来潮想用java实现与下位机的串口通讯,下位机使用STM32等间隔向串口发送八位的数据,上位机主要实现数据的接收和发送.过程中遇到的问题为:一旦执行到输入输出流对串口进行读写操作时,程序直接崩 ...

  7. 串口通信及串口转蓝牙相关知识

    之前没有接触过硬件相关的工作, 因此对硬件的知识一知半解. 最近由于项目需要, 用到了串口通信以及串口跟蓝牙之间通信相关的东西.记录下来, 希望对新手有所帮助. 如有疏漏之处, 欢迎指正. 1 串口通 ...

  8. 树莓派已经通过网络连接通过串口通信在串口调试小助手打印与操作

    在树莓派编译运行 树莓派已经通过网络连接通过串口通信在串口调试小助手打印C gcc xxx.c -lwiringPi 源码 #include <wiringSerial.h> #inclu ...

  9. 单片机第13课:串口通信---向计算机发送数据

    JP3接P0口. #include<reg51.h> #define uchar unsigned char uchar flag,num; // void initSer(); void ...

最新文章

  1. FlexUnit单元测试(第三章FlexUnit事件断言)
  2. 生成对抗网络GANs理解(附代码)
  3. mysql 使用中 修复 blog_Java My-Blog之mysql容器重复初始化严重bug修复过程
  4. [转]Java 关闭线程的安全方法
  5. arm linux qt 输入法,基于ARM9和Qt的中文手写输入法的设计与实现
  6. 以太坊怎么注册_以太坊2.0将至,牛市即将到来??
  7. 串口调试助手 rtc 显示时间_闪电侠串口网络调试助手
  8. 如何编译文件(gcc + nasm)
  9. ofo回应发币传闻:从未参与虚拟货币的发行 与GSE Lab合作已终止
  10. FBI或被允许隐瞒解锁iPhone技术 不向苹果公开
  11. 杭电oj1257最少拦截系统(贪心)
  12. 阿里云VPC和企业网络互通配置
  13. ccccccccccccccccccccc
  14. docx4j 操作word中的chart
  15. 小程序如何跳转至同服务器app,小程序新功能,app可以直接跳转小程序
  16. 三目表达式 java_Java 三目运算符表达式的一些问题
  17. Sqlmap中文手册
  18. UML建模工具 Visual Paradigm敏捷开发教程(一):如何确立项目愿景
  19. SAP权限管理,我的理解
  20. 一些学习gis有关的文章

热门文章

  1. 疯狂java讲义 光盘_书单丨24岁的Java,到底有多美?
  2. QLU ACM 2018新生赛
  3. 属于编程的黄金时代结束了吗?
  4. 黄金分割寻优算法(0.618法)的Matlab实现
  5. 坊间传言:程序员可以先在大厂镀金,以后去中小厂毫无压力,基本不会被卡,事实果真如此吗?
  6. 《贵州省大数据发展报告(2016)》白皮书发布
  7. matlab实现中值滤波程序,中值滤波流程(matlab平滑滤波和中值滤波程序)
  8. HR人才测评,什么是协调能力?如何提高协调能力?
  9. 力扣226:反转二叉树
  10. SQL查询的时候同时显示明细和总计