参考链接:
Afx全局函数及MFC常见数据类型
CSerialport类开源地址(国人在github上托管的)
CSerialPort串口类最新修正版及源码简单分析
Remon提供的串口类网址(英文)
[MFC]使用强大的第三方串口类 CSerialPort

相关问题

同步通信如何实现


更新:之前排版问题很严重,抱歉。(2016年11月6日 晚)

  • 什么是串口通信

串口是计算机与外围设备之间的数据传输通道,由于使用其进行通信非常方便,并且能够实现数据的长距离传输,因此它的使用非常广泛。在 Windows 环境下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源,即关闭串口。串口通信最重要的参数是率、数据位、停止位和奇偶校验。

  • 串口通信的数据格式


一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。

每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。

  • 偶校验与奇校验

在标准ASCII码中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

  • 停止位

停止位是按长度来算的。串行异步通信从计时开始,以单位时间为间隔(一个单位时间就是波特率的倒数),依次接受所规定的数据位和奇偶校验位,并拼装成一个字符的并行字节;此后应接收到规定长度的停止位“1”。所以说,停止位都是“1”,1.5是它的长度,即停止位的高电平保持1.5个单位时间长度。一般来讲,停止位有1,1.5,2个单位时间三种长度。

  • 波特率

波特率就是每秒钟传输的数据位数。波特率的单位是每秒比特数(bps),常用的单位还有:每秒千比特数Kbps,每秒兆比特数Mbps。串口典型的传输波特率600bps,1200bps,2400bps,4800bps,9600bps,19200bps,38400bps。
PLC/PC与称重仪表通讯时,最常用的波特率是9600bps,19200bps。PLC/PC或仪表与大屏幕通讯时,最常用的波特率是600bps。

  • 串口通信的通信方式

单工模式(Simplex Communication)的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。

半双工模式(HalfDuplex)通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工模式既可以使用一条数据线,也可以使用两条数据线。半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟,信息传输效率低些。

全双工模式(FullDuplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。

显然,在其它参数都一样的情况下,全双工比半双工传输速度要快,效率要高。

  • 典型的串口通信标准

①EIA RS232(通常简称“RS232”): 1962年由美国电子工业协会(EIA)制定。
②EIA RS485(通常简称“RS485”): 1983年由美国电子工业协会(EIA)制定。

项目所用的串口是RS232串口。

RS232串口

RS232是计算机与通信工业应用中最广泛一种串行接口。它以全双工方式工作,需要地线、发送线和接收线三条线。RS232只能实现点对点的通信方式。

RS232串口接口定义:
RXD:接收数据;
TXD:发送数据;
GND/SG:信号地。
电脑DB9针接口定义:
RS232串口缺点电脑DB9针接口是常见的RS232串口(如图),其引脚定义如下:
2号脚:RXD(接收数据)
3号脚:TXD(发送数据)
5号脚:SG或GND(信号地)
其它脚:我们不用

RS232串口缺点:
接口信号电平值较高,接口电路芯片容易损坏。
● 传输速率低,最高波特率19200bps。
● 抗干扰能力较差。
● 传输距离有限,一般在15m以内。
● 只能实现点对点的通讯方式。

  • VS2013 下串口通信的实现

在 VS2013 下, 实现串口通信的方法有以下几种:

  1. 使用 API 通信函数;
  2. 使用串口通信控件 MScomm;
  3. 使用微软提供的串口通信类 SerialPort类;
  4. 使用Remon Spekreijse写的开源类CSerialPort类;
    项目主要用CSerialPort类进行串口通信编程,接下来就以CSerialPort 介绍串口通信的实现。

CSerialPort类的简述

CSerialPort类是一名名叫Remon Spekreijse的所写的开源串口类,功能十分强大。

CSerialPort工作流程

首先设置好串口参数,再开启串口检测工作线程,串口检测工作线程检测到串口接收到的数据、流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接受数据而言的,发送数据可直接向串口发送。

CSerialPort类定义的消息

消息如下表:

消息名称 消息号 功能说明
WM_COMM_BREAK_DETECTED WM_USER+1 检测到输入中断
WM_COMM_CTS_DETECTED WM_USER+2 检测到CTS(清除发送)信号状态改变
WM_COMM_DSR_DETECTED WM_USER+3 检测到DSR(数据设备准备就绪)信号状态改变
WM_COMM_ERR_DETECTED WM_USER+4 发生线状态错误(包括CE_FRAMECE_OVERRUN,和CE_RXPARITY)
WM_COMM_RING_DETECTED WM_USER+5 检测到响铃指示信号
WM_COMM_RLSD_DETECTED WM_USER+6 检测到RLSD(接收线信号)状态改变
WM_COMM_RXCHAR WM_USER+7 接收到一个字符并已放入接受缓冲区
WM_COMM_RXFLAG_DETECTED WM_USER+8 检测到接受到字符(该字符已放入接受缓冲区)事件
WM_COMM_TXEMPTY_DETECTED WM_USER+9 检测到发送缓冲区最后一个字符已经被发送

端口初始化

首先, 设置几个主要参数:
(1) BaudRate(波特率)波特率是模拟线路信号的速率,是以波形每秒的震荡数来衡量,波特率主要有以下几种频率: 2400, 4800, 9600, 14400。
(2) PortName PortName是串口设备所使用的串口名称,在设计串口通信程序时,必须找到这个串口名称, 否则无法和串口设备建立连接进行通信 。
(3) ReceivedBytesThreshold这个参数主要是用来触发数据接收事件 DataReceived,当输入缓冲区中的数据量达到所设的数值时就触发, 否则就一直等待。

这些设置根据具体使用的串口设备, 本文设置为 9600,com1,1, 2048/4096。参数设置完后就调用串口打开函数, SerialPort1.InitPort ()。

串口读写操作

(1)初始化串口
流程:检查参数–>检测线程–>创建事件(监视线程)–>打开端口–>设置异步IO结构参数。
(2)监视线程的控制
即线程控制吧,主要有开启线程,复位和停止。
(3)监视线程
我们把读写串口的操作全部交给监视线程,现在简单看一下监视线程的大致流程:
检查串口–>进入循环{WaitCommEvent(不阻塞询问)询问事件–>如果有事件来到–>到相应处理(关闭\读\写)}
(4)读取数据操作
读取数据是一个异步操作,当有数据发来时,会触发读事件m_ov.hEvent,监视线程捕捉到事件后并获知是读事件,进入相关读处理,这里调用函数ReceiveChar,ReceiveChar中调用ReadFile函数将串口数据读到Buffer缓冲中。
(5)写数据操作
也是由监视线程操作,不过触发事件交给主线程来触发,函数是WriteToPort(),将数据写入缓冲区中,然后由线程调用的函数WriteChar(),把缓冲里的数据写到串口中,期间调用WriteFile().

关闭串口

当使用串口完毕后,关闭串口,该函数为:ClosePort()。

串口通信实例分析

项目基于CSerialPort类进行串口通信,实现下位机PLC与上位机PC机之间进行通信。
1)设计思想
在项目中,上下位机之间通信主要是角度传感器的角度值,故而以下就以角度传输来进行分析。
2)关键代码分析
①数据读取
当有数据发来后,触发读事件m_ov.hEvent,而后满足CserialPort类定义的WM_COMM_RXCHAR事件触发条件后,触发MFC里面的一个自定义消息映射宏ON_MESSAGE ,由此触发函数OnComm()进行缓冲区数据读取。

ON_MESSAGE(WM_COMM_RXCHAR, OnComm)
LONG CSerial_classDlg::OnComm(WPARAM ch, LPARAM port)
{……m_recv = ch; ……
}    

②数据写入
写数据相对而言比较简单,无须监控事件操作。准备好需要的数据后,直接调用函数WriteToPort()即可

void CSerial_classDlg::OnSend()
{……m_SerialPort.WriteToPort(buf);       //发送数据
}

串口通信--CSerialport类相关推荐

  1. 【Unity3D软硬件】Unity3D与串口通信 SerialPort类完全教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  2. Android 蓝牙串口通信工具类 SeriaPortUtil 2.0.+

    原文地址:https://www.shanya.world/archives/2fd981ea.html SerialPortUtil 提示 最新版本 3.0.+ 已发布,其对比 2.0.+ 版本,A ...

  3. C#串口通信 SerialPort类

    因为公司项目需要将USB扫码枪改为串口扫码枪,串口扫码的好处在于不需要一个输入框来接受USB扫出来的文本,能解决多个扫码枪一起扫码时的并发问题,所以需要用到多线程及串口技术. 一.串口通信简介 串行接 ...

  4. java 获取温度_Java利用RXTX串口通信工具类获取DS18B20温度传感器的温度值

    环境:Windows10,Eclipse4.5.2,JDK1.7 设备:DS18B20温度传感器(4线,485接口),USB转485接口转换器,笔记本电脑 注意点:RTU传输,使用的是字节,那么在程序 ...

  5. ARM芯片(S5PV210芯片)——串口通信详解

    1.电子通信的基本概念 1.1.同步通信和异步通信 1.同步通信:通信双方有统一的工作节拍,一般需要发送方给接收方发送信息的同时发送时钟信号,接收方根据发送方给它的时钟信号来安排自己的工作节奏.同步通 ...

  6. java与单片机通信_Java实现串口通信与单片机通信实例..【Pnoter】

    一 · 在windows操作系统下,实现Java串口通信,需要用到sun提供的串口通信包,javacomm[可以去Java站点去下载最新版本的压缩包,然后解压]. 解压之后要用到压缩包中的三个文件,将 ...

  7. Java结合Web页面使用多线程实现全双工串口通信

    在几天在接手的项目中要求实现串口全双工通信,由于自己Java也是刚刚开始学习有些概念还不是理解的很透彻,所以这个工程还是花费了点时间,遇到了些许问题都会在这篇文章中有所体现,还有源码凹,希望可以帮助到 ...

  8. 谷歌Android开源串口通信使用

    Demo下载地址: 谷歌官方串口库使用 引言: 现在的串口通信多用于嵌入设备中,Android主板与各种板卡之间的通信.因此串口通信在未来智能设备中应用会很广泛. 现在市面上几乎所有的Android串 ...

  9. 使用RXTXcomm进行串口通信

    RXTXcomm 串口通信 虚拟串口和串口调试助手的使用 虚拟串口软件:VSPD,https://www.eltima.com/cn/products/vspdxp/ VSPD会自动识别出本台计算上有 ...

最新文章

  1. Office EXCEL 如何为宏命令指定快捷键或者重新设置快捷键
  2. HTTP协议 ----响应消息
  3. 设计行业的新宠——云渲染
  4. 服务器zip解压php,服务器端解压缩zip的脚本
  5. linux ssh和sftp区别,Linux SSH和SFTP配置
  6. Java:线程并发工具类
  7. git 远程代码被覆盖
  8. Android Track的play流程(三十二)
  9. POJ 3264 -----RMQ问题
  10. 【RPC】远程过程调用
  11. Oracle 11.2.0.4 下载地址
  12. 【原创】2021-2001广东统计年鉴面板数据、珠三角数据、广东年鉴(可直接使用)
  13. 游戏挂机时计算机设置在哪里,蜂窝助手怎么挂机 游戏蜂窝电脑版挂机设置教程...
  14. python涨工资问题_7-45 jmu-python-涨工资 (10 分)
  15. python程序设计心得体会感想-如何快速学会Python
  16. linux 根据字母产生颜文字 figlet
  17. 如何用Jquery获取某一个Div的Class或者ID
  18. html360全景图原理,HTML5 Canvas实现360度全景图
  19. Matlab 基础04 - 冒号Colon operator “:”的使用和复杂应用详析
  20. 乱斗西游2服务器没响应,乱斗西游2月3日维护_无法连接服务器公告_蚕豆网新闻...

热门文章

  1. 哪些数字适合作为域名主体?
  2. 嗯?你的VS2019运行黑框一闪而过嘛
  3. oracle转借权限,Oracle Universal Connection Pool(UCP) for JDBC 详解
  4. LINUX 宏__define_initcall(level,fn)的作用 和 do_initcalls()
  5. linux 宏的作用域,Linux 系统编程:几个宏定义
  6. win7家庭版和旗舰版区别_WIN7_64位系统安装 MicroWIN_SP9后没有PC-PPI通讯协议怎么处理?...
  7. 通过read()读文件
  8. 周计划周记录:2022年6月6日-2022年6月12日
  9. 采用 bsdiff 开源库 Android 的增量更新,差分更新 服务器端客户端
  10. hdu 1861 游船出租