没有合适的资源?快使用搜索试试~ 我知道了~
MFC实战篇-VS实现基于MFC的串口通信程序实例-串口通信.pdf
需积分: 0 4 下载量 172 浏览量
2023-03-30
20:34:07
上传
评论
收藏 903KB PDF 举报
温馨提示
试读
17页
mfc串口通信的接收与发送 一、串口通信的概念 二、串口通信的三种协议 2.1 RS-232 2.2 RS-422 2.3 RS-485 三、串口通信方法和用处 3.1 用处 3.2 串口通信方法 四、重要参数 4.1 波特率 4.2 数据位 4.3 停止位 4.4 奇偶检验位 五、串口通信的实现 5.1 微软的串口通信控件MSComm 5.1.2 版本不兼容的注意事项 5.1.3 属性 5.1.4 MSComm控件的事件 5.1.5 串口数据的读写 5.1.5.1 数据的发送 5.1.5.2 数据的接收 5.1.6 数据类型的处理 5.1.7 MFC相关知识 5.1.7.1 SetDlgItemTextW函数 5.1.7.2 ComboBox 5.1.7.2.1 Combo Box (组合框)控件 5.1.7.2.2 为ComboBox添加下拉选项 5.1.7.2.3 如何控制Combo Box的下拉长度 5.1.7.2.4 VC++ Combo Box/Combo Box Ex控件 5.1.7.2.5 列表框几种常用的消息映射宏 5.1.8 代码 5.2 使用第三方CSerial
资源推荐
资源详情
资源评论
文章目录
一、串口通信的概念
二、串口通信的三种协议
2.1 RS-232
2.2 RS-422
2.3 RS-485
三、串口通信方法和用处
3.1 用处
3.2 串口通信方法
四、重要参数
4.1 波特率
4.2 数据位
4.3 停止位
4.4 奇偶检验位
五、串口通信的实现
5.1 微软的串口通信控件MSComm
5.1.2 版本不兼容的注意事项
5.1.3 属性
5.1.4 MSComm控件的事件
5.1.5 串口数据的读写
5.1.5.1 数据的发送
5.1.5.2 数据的接收
5.1.6 数据类型的处理
5.1.7 MFC相关知识
5.1.7.1 SetDlgItemTextW函数
5.1.7.2 ComboBox
5.1.7.2.1 Combo Box (组合框)控件
5.1.7.2.2 为ComboBox添加下拉选项
5.1.7.2.3 如何控制Combo Box的下拉长度
5.1.7.2.4 VC++ Combo Box/Combo Box Ex控件
5.1.7.2.5 列表框几种常用的消息映射宏
5.1.8 代码
5.2 使用第三方CSerialPort API
一、串口通信的概念
串口通行是一种将接受来自cpu的并行数据字符转化为连续的串行数据流发送出去,同时可将接收的串行数据流转化为并行的数据字符供给
cpu的器件。
串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在
远距离通信中可以节约通信成本,但其传输速度比并行传输低。
串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线
接收数据。
串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时
在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通
信的端口,这些参数必须匹配。
二、串口通信的三种协议
2.1 RS-232
RS-232使用费平衡参考地的信号。
RS-232只限于PC串口和设备间点对点的通信。
RS-232串口通信最远距离是50英尺。
RS-232针脚的功能:
数据:
| 引脚 | 作用 |
| TXD(pin3) | 串口数据输出 |
| RXT(pin2) | 串口数据输入 |
握手
引脚 作用
RTS(pin7) 发送数据请求(requst to send)
CTS(pin8) 清除数据 clear to send
DSR(pin6) 数据发送就绪date send ready
引脚 作用
DCD(pin1) 数据载波检测date carrier detect
DTR(pin4) 数据终端就绪date terminal ready
地线:
引脚 作用
GND(pin5) 地线
其它
引脚 作用
RI(pin 9) 铃声指示
通信方式采用连接三线:TX,Rx和地线。但是对于数据传输,双方需要对数据定时使用相同的载波率。
2.2 RS-422
RS-422是苹果计算机的串口连接标准。
使用差分信号。差分传输使用二根线实现发送和接收信号具有更好的抗噪声和更远的传输距离。
2.3 RS-485
RS-485是RS-422的改进,增加了设备的个数,从10个增加到32。
RS-485的引脚的功能:
数据:1(DATA-) 2(DATA+)
地线:5
三、串口通信方法和用处
3.1 用处
大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
串口通信协议也可以用于获取远程采集设备的数据。
3.2 串口通信方法
1. 利用Windows API通信函数;
在32位的Windows系统中,串口和其它通信设备是作为文件处理的。串口的打开、关闭、读取和写入所用的函数与操作文件的函数完全一
致。
1. 通信会话以调用CreateFile()开始。CreateFile()为读访问、写访问或读写访问“打开”串口。按照Windows的通常做法,CreateFile()
返回一个句柄。
2. 关闭串口调用CLoseHandle().
3. 获取串口的当前配置:getCommState()
4. 实现初始化的缓冲区控制:SetupComm()
5. ReadFile()和WriteFile()读写数据。
6. 利用GetCommMask()函数和 SetCommMask函数控制通信事件。
感觉每个函数都非常的复杂,参数非常多。但是直接使用windows系统提供的串行口API函数相对较为灵活
2. 利用Visual C++的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;
3. 通过微软的串口通信控件MSComm,它是一种ActiveX控件;
4. 利用第3方编写的通信类,比如MuMega Technologies公司提供的CSerail类;
四、重要参数
4.1 波特率
衡量符号传输速率的参数。
指的是信息被调制之后单位时间内的变化。即单位时间内载波参数变化的次数。
如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位
*240个/秒=2400bps。
4.2 数据位
衡量通信中实际传输数据的参数。
计算机发出一个信息包,实际的数据位7或者8位。每个包是一个字节,包括开头位和停止位。
实际数据位取决于通信协议的选举。
4.3 停止位
用于表示单个包的最后一位。典型的值为1、1.5/2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输
的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
4.4 奇偶检验位
在串口通信中一种简单的检错方式。
有四种检错方式:偶、奇、高和低。没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如 : 如果数据是011,
对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
对于奇校验,校验位为1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了
通信或者是否传输和接收数据是否不同步
五、串口通信的实现
5.1 微软的串口通信控件MSComm
MSComm控件通过串行端口传输和接受数据的,为应用程序提供串行通讯功能。
Microsoft Communications Control(简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控
件。它为应用程序提供了通过串行接口收发数据的简便方法。
MSComm控件提供了两种处理通信问题的方法:
▪
◾
◼
🔲
1. 事件驱动(Event-driven)方法
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知。
例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情
况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在
OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多
个 MSComm 控件。
▪
◾
◼
🔲
2. 查询法
查询方式实质上还是事件驱动。但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent
属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
5.1.2 版本不兼容的注意事项
MSComm控件函数更新使用:
新版本的Visual studio使用MSComm时之前很多以Set开头或者Get开头的函数都改成了以Put_开头或者Get_开头。
如之前的SetCommPort改成 Put_CommPort;GetInput改成Get_Input;
5.1.3 属性
portOpen
1. Bool get_PortOPen() 返回当前是否打开串口 ,true为打开,false为关闭。
2. void put_PortOpen(bool newValue)设置串口打开,参数newValue为要打开的串口号。
3. 设置或返回通讯口的状态以及打开和关闭端口,可通过把该属性设置为true或者false来打开或者关闭端口;
CommPort设置并返回端口号
1. put_CommPort(short nnewvalue)设置需要打开的端口号
2. short get_CommPort()获取已经打开的串口号
3. 可以设置为1到16之间的任何值;
4. 注意: 在打开串口之前必须要设置要打开的串口。在关闭串口前也必须保证串被关闭串是处于打开状态的。
BufferSize
1. put_InBufferSize(short newValue) 设置输入缓冲区大小,缺省下为1024Byte
2. put_OutBufferSize(short newValue) 设置输出缓冲区大小,缺省为1024字节
BufferCount
1. InBufferCount(short newValue);设置接收缓冲区内等待读取的字节数,是指已接收。参数为0表示清空接收缓冲区。
2. OutBufferCount(short newValue);设置/获得发送缓冲区内等待发送的字节数,0为清空发送缓冲区
put_InputMode()
1. put_InputMode()设置为以二进制或者字符串的方式进行输入。
2. comInputModeText(0):表示以文本(ASCII)方式取回数据;
comInputModeBinary(1):表示以二进制方式取回数据;
comInputModeText, comInputModeBinary为预定义常量,分别表示0,1。
put_RThreshold()
1. 当输入缓冲区的字符达到设置的阈值时,控件就会产生一个onComm事件,并且CommEvent属性设置为ComEvReceive,即为接受
事件。
2. 语法:object.put_RThreshold(len);
3. value为整型表达式。 收到len个字节将引发onComm事件
4. 当接收字符后,若 RThreshold 属性设置为 0(缺省值)则不产生 OnComm 事件
put_SThreshold属性
1. 每当串口缓冲区有多于或等于设定的某个字节数据时触发接收数据的onComm函数,而且MSComm 控件设置 CommEvent 属性为
comEvSend ,即为发送事件。
2. 语法 object.put_RThreshold(value);
3. value 整形表达式,代表在 OnComm 事件产生之前在传输缓冲区中的最小字符数。
4. 若设置 SThreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。
若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字
符数与 Sthreshold 交叉时被激活一次。
例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有
比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。
put_Settings()
1. 设置通信的参数,格式为:波特率,奇偶校验类型,数据位,停止位;
2. 语法: object_put_Settings( value)
3. 说明:当端口打开时,如果 value 非法,MSComm 控件产生错误 380(非法属性值)。
4. Value 由四个设置值组成,有如下的格式:
“BBBB,P,D,S”
1. BBBB 为波特率
2. P 为奇偶校验,
3. D 为数据位数,
4. S 为停止位数。
5. value 的缺省值是:“9600,N,8,1”
m_mscomm.put_Settings(_T(“9600,n,8,1”));//波特率9600 、无校验位,8位数据位,1位停止位。
put_InputLen()
1. 确定希望从接收缓冲区移出的字符数量,当InputLen=0时,一次把接收缓冲区的字符全部移出;
2. 语法:object.put_InputLen(value)
3. value是整型表达式,说明input属性从缓冲区读取的字符数。InputLen 属性的缺省值是 0。设置InputLen 为 0 时,使用 Input 将使
MSComm 控件读取接收缓冲区中全部的内容。
4. 若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 ("")。在使用 Input 前,用户可以选择检查 InBufferCount 属
性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。
OutPut属性
1. 向发送缓冲区传递待发送的数据。
2. 形式 :object . put_Output(COleVariant(date));
Input属性
1. 从接收缓冲区中读出数据,然后将该数据从缓冲区移走
2. 形式:object.get_Input();
剩余16页未读,继续阅读
资源评论
CodingLife99
- 粉丝: 1110
- 资源: 454
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功