问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...studio2010下用CSerial Port类做串口通讯工具编译不报错运行报错的问...

发布网友 发布时间:2024-10-03 02:36

我来回答

2个回答

热心网友 时间:2024-11-10 10:16

用VC++6.0实现PC机与单片机之间

串行通信的方法

湖南大学(长沙410082) 于小亿 王 辉 张志学

摘 要 详细介绍了在Windows环境下应用VC++实现PC机与单片机的几种串行通信方法,给出了用Visual C++6.0编写的PC机程序和用C51编写的单片机通信程序。经实际应用系统运行稳定可靠。

关键词 Visual C++ 类 串行通信

--------------------------------------------------------------------------------

工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。

VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT 类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。

1 Windows API通信函数方法

与通信有关的Windows API函数共有26个,但主要有关的有:

CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。

ReadFile() 读串口。

WriteFile() 写串口。

CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。

2 利用端口函数直接操作

这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:

int _inp(unsigned shot port)

该函数从端口读取一个字节,端口号为0~65535。

写端口的函数原型为:

int _outp(unsigned shot port, int databyte)

该函数向指定端口写入一个字节。

不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述。

 

3 MSComm控件

MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。

3.1 MSComm控件的属性

CommPort:设置串口号,类型 short :1-comm1 2-comm2.

Settings:设置串口通信参数,类型 CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。

PortOpen:设置或返回串口状态,类型 BOOL:TURE打开,FALSE关闭。

InputMode:设置从接收缓冲区读取数据的格式,类型 long: 0-Text 1-Bin。

Input:从接收缓冲区读取数据,类型 VARIANT。

InBufferCount:接收缓冲区中的字节数,类型:short。

InBufferSize:接收缓冲区的大小,类型:short。

Output:向发送缓冲区写入数据,类型:VARIANT。

OutBufferCount:发送缓冲区中的字节数,类型:short。

OutBufferSize:发送缓冲区的大小,类型:short。

InputLen:设置或返回Input读出的字节数,类型:short。

CommEvent:串口事件,类型:short。

 

3.2 程序示例

串口初始化

if (!m_comm.GetPortOpen())

m_comm.SetPortOpen(TURE); /*打开串口*/

m_comm.SetSettings( "4800,n,8,1 "); /*串口参数设置*/

m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/

m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/

接收数据

m_comm.SetInputLen(1); /*每次读取一个字符

VARINAT V1=m_comm.GetInput();

/*读入字符*/

m_V1=V1.bstrval;

发送字符 m_comm.SetOutput(Colevariant ( "Hello "); /*发送 “Hello” */

3.3 注意

SetOutput方法可以传输文本数据或二进制数据。用SetOutput方法传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。此处望引起读者注意,笔者曾经在此犯错。

4 VC++类CSerial

4.1 串行通信类CSerial简介

Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。以下为该类定义的说明部分。

class CSerial

{

public:

CSerial();

~CSerial();

BOOL Open( int nPort = 2, int nBaud = 9600 );

BOOL Close( void );

int ReadData( void *, int );

int SendData( const char *, int );

int ReadDataWaiting( void );

BOOL IsOpened( void ){ return( m_bOpened ); }

protected:

BOOL WriteCommByte( unsigned char );

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_OverlappedWrite;

BOOL m_bOpened;

}

 

4.2 串行通信类Cserial 成员函数简介

1. CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。

2. CSerial:: Open这个成员函数打开通信端口。带两个参数,第一个是埠号,有效值是1到4,第二个参数是波特率,返回一个布尔量。

3. CSerial:: Close函数关闭通信端口。类析构函数调用这个函数,所以可不用显式调用这个函数。

4. CSerial:: SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。

5. CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。

6. CSerial:: ReadData函数从端口接收缓冲区读入数据。第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。

热心网友 时间:2024-11-10 10:09

dwwdwd
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
草青青,青青草,草上接谢珍珠宝,怕日晒怕风摇,摇看珍珠得起早 谜底是... 一加9R要不要升级ColorOS 13正式版 一加9pro怎么coloros12一加9pro升级coloros12的方法 coloros12支持哪些一加机型?coloros12支持一加机型介绍 一加9pro如何coloros12?一加9pro升级coloros12的方法 一加9pro升级coloros12拍照改善吗 我是一个高中生,职教的,我们班上有5个女生,我喜欢有一个,但追她又有... 自动挡d挡旁边的 -是什么意思? 自动挡位上的加减是什么意思? 宣传这个职位是干什么的 大家点评一下我的香港一日游线路,支支招啊 2015款 大众凌渡 1.8T DSG 330TSI 豪华版 14万公里保养项目价格 2015款 大众凌渡 1.8T DSG 330TSI 豪华版 13万公里保养项目价格 ...硪比较喜欢伤感德歌,网络歌曲也可以、谢谢各位大 ...生气闹别扭,不管怎么吵闹女友就是不删除不拉黑我,这种人到底是谁... 2015款 大众凌渡 1.8T DSG 330TSI 豪华版 14万公里保养项目费用 请各位友友帮忙推荐下《我的离开也是爱》《弥敦道》类型的伤感粤语歌曲... 谢谢,告诉我请各位友友帮忙推荐下《我的离开也是爱》《弥敦道》类型的... 2015款 大众凌渡 1.8T DSG 330TSI 豪华版 3万公里保养项目费用 ...然后逼她。让她把我拉黑,为什么她没有拉黑我。就是不理我,打电话... 2015款 大众凌渡 1.8T DSG 330TSI 豪华版 3万公里保养项目价格 北的反义词 ...手机现在想买耳机,Airpods Pro 2代和AirPods 3代该入手哪个?_百度... 人民币与新台币的最新汇率是多少啊? 请问人民币、新币的汇率是多少?谢谢。 怎样弄掉衣服上专门粘图案的胶?是那种表面透明反光的,有点像双面胶.但... ...那怕是讨厌我,还是拉黑我。还是不理我,她生我的气。在意我?_百度知 ... 网上买的抖音号红色数字代表什么 拉姆塞死神定律拉姆塞定律由来 拉姆塞死神定律定律简介 记事本中怎么打分号?就是我想在记事本中打2分之一怎么打? 网络营销培训机构各机构简介 怎么撤回163邮箱发到QQ邮箱里的邮件急 北_怎么读 北_读音是什么 她为什么那么讨厌我,给我拉黑了? ...爱我,你可以直接跟我说,我又不是不让你走,非拉黑有什么用 "MOS"缩写在计算机硬件领域的具体应用是什么? 为什么我的百度云网盘分享出来的连接我明明没有取消但是都是已取消分享... 求助,百度云分享的链接一下子全部失效是什么原因 关于项目的可行性报告:怎么下关于投资项目的可行性报告,是否要找工程... 百度云无缘无故被封了………需要解封………急 ...心里的位置重要嘛。她让我拉黑她,她就是不拉黑我? 项目可行性分析报告项目可行性分析资质 ...论我怎么伤害她。她不舍得我。我在她的心里位置重要嘛? 我怎么伤害女孩。女孩都不拉黑我。我是不是在她心里有一定的位置呀? ...她没生气。反正她不舍得拉黑我。她也知道我喜欢她? ...她也好像对我有意思,她很爱发我脾气,生我气,,她爱我么? 我想知道她是不是生我的气了?? 电脑上没有摄像头可以照相吗 《庄子·外篇·天地》简介