VC串口通讯实例

上传人:pu****.1 文档编号:430799930 上传时间:2022-11-30 格式:DOC 页数:7 大小:61KB
返回 下载 相关 举报
VC串口通讯实例_第1页
第1页 / 共7页
VC串口通讯实例_第2页
第2页 / 共7页
VC串口通讯实例_第3页
第3页 / 共7页
VC串口通讯实例_第4页
第4页 / 共7页
VC串口通讯实例_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《VC串口通讯实例》由会员分享,可在线阅读,更多相关《VC串口通讯实例(7页珍藏版)》请在金锄头文库上搜索。

1、在 VC+ 中有两种方法可以进行串口通讯。一种是利用 Microsoft 公司提供的 ActiveX 控件 Microsoft Communications Control 。另一种是直接用 VC+ 访问串口。下面将简 述这两种方法。一、 Microsoft Communications ControlMicrosoft 公司在 WINDOWS 中提供了一个串口通讯控件,用它,我们可以很简单 的利用串口进行通讯。在使用它之前,应将控件加在应用程序的对话框上。然后再用 ClassWizard 生成相应的对象。现在我们可以使用它了。该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序

2、设置。 我推荐用程序设置,这样更灵活。SetCommPort :指定使用的串口。GetCommPort :得到当前使用的串口。SetSettings :指定串口的参数。一般设为默认参数 9600 ,N,8, 1。这样方便 与其他串口进行通讯。GetSettings :取得串口参数。SetPortOpen :打开或关闭串口,当一个程序打开串口时,另外的程序将无法使 用该串口。GetPortOpen :取得串口状态。GetInBufferCount :输入缓冲区中接受到的字符数。SetInPutLen :一次读取输入缓冲区的字符数。设置为 0 时,程序将读取缓冲区 的全部字符。GetInPut :

3、读取输入缓冲区。GetOutBufferCount :输出缓冲区中待发送的字符数。SetOutPut :写入输出缓冲区。般而言,使用上述函数和属性就可以进行串口通讯了。以下是一个范例#defi ne MESSAGELENGTH 100 class CMyDialog : public CDialogprotected:VARIANT I nBuffer;VARIANT OutBuffer;CMSComm m_Com;public: BOOL CMyDiaLog:O nlni tDialog()CDialog:O nlni tDialog();m_Com.SetCommPort(1);if (!

4、m_Com.GetPortOpe n() m_Com.SetSett in gs(57600,N,8,1); m_Com.SetPortOpe n(true);m_Com.Setl nBufferCou nt(O);SetTimer(1,10,NULL);In Buffer.bstrVal=new un sig ned shortMESSAGELENGTH;OutBuffer.bstrVal=new un sig ned shortMESSAGELENGTH; OutBuffer.vt=VT_BSTR;return true;void CMyDiaLog:O nTimer(UINT nIDEv

5、e nt)if (m_Com.GetI nBufferC oun t()=MESSAGELENGTH) In Buffer=m_Com.Get In put();/ handle the In Buffer./ Fill the OutBuffer.m_Com.SetOutput(OutBuffer);CDialog:O nTimer( nIDEve nt);用该控件传输的数据是 UNICODE格式。关于UNICODE和ANSI的关系和转换请 参看MSDN。关于该控件的其他详细资料请查看 MSDN关于COMM CONTROL部分。二、直接用VC+访问串口。在VC+中,串口和磁盘文件可以统一的方

6、式来简单读写。这两者几乎没有什么不 同,只是在 WINDOWS 9X 下磁盘文件只能做同步访问,而串口只能做异步访问。CreateFile :用指定的方式打开指定的串口。通常的方式为m_hCom = CreateFile( COM1, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );m_hCom 为文件句柄。GENERIC_READ | GENERIC_WRITE 指定可以对串口进 行读写操作。第三个参数 0表示串口为独占打开。

7、OPEN_EXISTING 表示当指定串口 不存在时,程序将返回失败。 FILE_ATTRIBUTE_NORMAL |FILE_FLAG_OVERLAPPED 则表示文件属性。当打开串口时,必须指定 FILE_FLAG_OVERLAPPED ,它表示文件或设备不会维护访问指针,则在读写时,必 须使用OVERLAPPED 结构指定访问的文件偏移量。ReadFile :读取串口数据。WriteFile :向串口写数据。CloseHandle :关闭串口。COMMTIMEOUTS : COMMTIMEOUTS 主要用于串口超时参数设置。 COMMTIMEOUTS 结构如下:typedef struc

8、t _COMMTIMEOUTS DWORD ReadI ntervalTimeout;DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutCo nsta nt;DWORD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutCo nsta nt; COMMTIMEOUTS,*LPCOMMTIMEOUTS;ReadI ntervalTimeout :两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的数据。设置为0表示该参数不起作用。ReadTo

9、talTimeoutMultiplier :读取每字符间的超时。ReadTotalTimeoutConstant : 一次读取串口数据的固定超时。所以在一次读取串口的操作中,其超时为 ReadTotalTimeoutMultiplier乘以读取的字节数再加上ReadTotalTimeoutConstant 。将 ReadlntervalTimeout 设置为 MAXDWORD,并将 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant设置为 0,表示读取操作将立即返回存放在输入缓冲区的字符。WriteTotalTimeoutMultipli

10、er:写入每字符间的超时。WriteTotalTimeoutConstant : 一次写入串口数据的固定超时。所以在一次写入串口的操作中,其超时为 WriteTotalTimeoutMultiplier 乘以写入的字节数再加上 WriteTotalTimeoutC on sta nt 。SetCommTimeouts函数可以设置某设备句柄的超时参数,要得到某设备句柄的超 时参数可以用GetCommTimeouts 函数。DCB : DCB结构主要用于串口参数设置。该结构太庞大,这里就不一一讲述了, 有兴趣者可查看 MSDN关于DCB的描述。其中下面两个是比较重要的属性。BaudRate :串口

11、的通讯速度。一般设置为9600。ByteSize :字节位数。一般设置为 8。DCB结构可以用SetCommState函数来设置,并可以用GetCommState来得到现 有串口的属性。SetupComm :设置串口输入、输出缓冲区。OVERLAPPED :保存串口异步通讯的信息。具体结构如下:typedef struct OVERLAPPED DWORD In ternal;DWORD In ternalHigh;DWORD Offset;DWORD OffsetHigh;HANDLE hEve nt; OVERLAPPED;Internal , InternalHigh是保留给系统使用的,

12、用户不需要设置。Offset,OffsetHigh是读写串口的偏移量,一般设置OffsetHigh为NULL,可以支持2GB数据。hEvent读写事件,因为串口是异步通讯,操作可能被其他进程堵塞,程序可以通 过检查该时间来得知是否读写完毕。事件将在读写完成后,自动设置为有效。通过以上这些函数和结构,我们就可以通过串口进行通讯了,现在我们具体看下面的实例:BOOL CSerial:Open( int nPort, int nBaud )if( m_bOpened ) return( TRUE );char szPort15;DCB dcb;wspri ntf( szPort, COM%d, n

13、Port );m_hComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );if( m_hComDev = NULL ) return( FALSE );memset( & m_OverlappedRead, 0, sizeof( OVERLAPPED );memset( & m_OverlappedWrite, 0, sizeof( OVERLAPPED );COMMTIMEOUT

14、S CommTimeOuts;CommTimeOuts.Readl ntervalTimeout = 0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutC on sta nt = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutCo nsta nt = 5000;SetCommTimeouts( m_hComDev, & CommTimeOuts );m_Overl

15、appedRead.hEve nt = CreateEve nt( NULL, TRUE, FALSE, NULL ); m_OverlappedWrite.hEve nt = CreateEve nt( NULL, TRUE, FALSE, NULL );dcb.DCBle ngth = sizeof( DCB );GetCommState( m_hComDev, &dcb ); dcb.BaudRate = n Baud;dcb.ByteSize = 8;if( !SetCommState( m_hComDev, &dcb ) | !SetupComm( m_hComDev, 10000, 10000 ) | m_OverlappedRead.hEve nt = NULL | m_OverlappedWrite.hEve nt = NULL ) DWORD dwError = GetLastError();if( m_OverlappedRead.hEve nt != NULL )CloseHa ndle( m_OverlappedRead.hEve nt );if( m_Overlapped

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号