串口通信编程--多线程异步方式

转载请注明出自:blog.csdn.net/mingojiang

 

目录

一串口通信基础      

1.1串口通信原理与特点     

1.2串口通信的传输方式     

1.3串口通信的同步技术     

1.4串行接口标准     

API函数实现串口通信   

2.1打开串口 

2.1.1串口是否有驱动    

2.1.2连接串口    

2.1.3串口逻辑端口号大于10无法打开问题 

2.2串口配置 

2.2.1设置缓冲区大小    

2.2.2设置串口状态  

2.2.3设置需通知的事件      

2.2.4清空缓冲区      

2.3异步接收数据     

三示例代码 

3.1连接串口并设置参数     

3.2发送与接收数据 

3.3关闭串口 

 

 

 

串口通信基础

        提到串口让人想起并口,它们是计算机中两个比较重要的通信方式.

串口:也叫COM,把字节的二进制位按位列队进行传输,每个字节占一个固定的时间长,速度慢,但是传输距离远,9针和25针两种,是阳插座(插座中有针凸起),目前25针较少使用;Modem\鼠标\USB\老式摄像头等都是用串口.

并口:把字节的二进制位用多条线同时传输,速度快串口8倍左右,传输距离有限,一般计算机内部数据传输用此方式,平常使用的有打印机,扫描仪等;25,阴插座(插座有25个针孔).

 

1.1串口通信原理与特点

        串行端口是CPU与串行设备间的编码转换器,CPU经过串行端口发数据时,字节数据列队成串行位,串行端口接收数据时,串行位转换成字节数据.所以必须安装相应的驱动程序.

        串行通信有成本低的特点,而且可以在现有的电话网络上进行传输,家庭通过电话线上网即是这种方式.只要配置一个相应的通信接口,:Modem.

1.2串口通信的传输方式

        单工:只能从一头传输到另一头,如只能从AB传或者BA,如看电视,只允许电视台向电视发数据,不允许电视向电视台发数据.在单工传输方式上一般采用两个通信,一个通道传输数据,一个通道传输控制信号.

        半双工:允许互传信息,但是不能同时进行,如对讲机,A说话时,B不能说话,B说话时A不能说话.

        全双工:允许双同时通信,如讲电话.

1.3串口通信的同步技术

        物理连接建立后,需要使用一种机制使对方正确解释发送的数据,发送方安位发出数据后,接收方如何识别这些数据,并如何正确组装成正确的字节.这就需要同步技术.数据同步技术一般解决如下问题:

² 确定发送数据起始时间

² 发送数据的传输速率

² 发送数据所需的时间

² 发送时间间隔

3.1异步传输

        按字节为单位传输,异步传输方式也叫起止方式,在被传输的字节前后加起止位,起止位无信号时处于高电平,接收方检测到低电平信号表示开始接收,收到停止信号表示传输完成.

3.2同步传输

        以数据块为单位传输,在块的前后加一个特殊字节表示起止,传输效率高,线路利用率高,设备负担也大.

1.4串行接口标准

        常用标准有RS-232C,RS-485,RS-422,其中RS-232C被广泛用于计算机串口通信.RS-232C标准要求一般线路不要超过15.

 

API函数实现串口通信

        API函数串口编程,可采用简单的查询方式或定时方式,也可采用复杂的事件驱动方式,所谓事件驱动方式是当输入缓冲区中有数据时,将自动调用某个方法执行相应的操作.定时方式是在一定的时间间隔内判断缓冲区内有数据被写入,此方法效率不高,查询方式就更落后的一种方式.所以设计的好的串口通信程序一般用事件驱动,有实时,高效,灵活等特点.

一般编制串行通信程序分以下几个部分:

Ø 打开串行端口:打开通信资源,设置通信参数、设置通信事件、创建读、写事件、进入等待串口消息循环。

Ø 读取串行端口信息:当串口发生EV_RXCHAR(接收到字符并放入了输入缓冲区)消息后读取串口、数据传输错误处理、字符串处理如回车符、空格并相应转化成数据,如果模拟量还要进行数据检验等功能。

Ø 写串行端口信息:将要发送的信息写入串口,相应进行错误处理。

Ø 断开串行端口连接:关闭事件,清除通信事件,丢弃通信资源并关闭。

 

2.1打开串口

2.1.1串口是否有驱动

        如何判断PC机中串口是否正常,驱动是否安装,串口名(逻辑端口名)是多少.如果PC机有串口同时驱动正常,那么在注册表的HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP目录下,包含字符"Serial""VCom"项下面的值就是,可以有多项,如下图:

SERIALCOMM下有一个值----COM11,表明有一个可用串口,如果目录下包含字符SerialVCom的项下没有任何值,表明没有串口或者驱动不正常.以下是获取串口逻辑名的代码:

#define MAX_KEY_LENGTH   255

#define MAX_VALUE_NAME  16383

HKEY hTestKey;

if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hTestKey) ){

        TCHAR   achClass[MAX_PATH] = TEXT(""); // buffer for class name

        DWORD   cchClassName = MAX_PATH; // size of class string

        DWORD   cSubKeys=0;                  // number of subkeys

        DWORD   cbMaxSubKey;             // longest subkey size

        DWORD   cchMaxClass;             // longest class string

        DWORD   cValues;             // number of values for key

        DWORD   cchMaxValue;         // longest value name

        DWORD   cbMaxValueData;      // longest value data

        DWORD   cbSecurityDescriptor; // size of security descriptor

  • 25
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MingoJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值