访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
基于Visual C++6.0的PC机与DSPs的串行通信
内容导读:
基于Visual C++6.0的PC机与DSPs的串行通信 中国科学技术大学李鹏怀戴礼荣王仁华李枫 摘要在Visual C++ 6.0环境下,利用Windows 98操作系统的多线程技术和Win 32应用程序接口(API)开发串行通信程序。给出以定点DSP芯片ADSP\ 2181为核心的数字语音记录仪和PC机通信程序实例,编写并调试通过了所有程序。 关键词串行通信Visual C++6.0APIADSP\ 2181RS\ 232 前言 在实际的监控及自动控制系统中,经常要进行微机与微机、微机与脱机监控系统之间的数据交换。串行通信是广泛采用的一种通信手段,它高效、方便,并且遵循统一的国际标准。现有的用于串行通信的应用程序,大多数是基于MS\ DOS操作系统的。这些程序在Windows 98下运行时稳定性较差,甚至不能正常运行,需要向Windows 98移植。我们采用Visual C++6.0作为程序设计语言,设计了基于Windows操作系统的应用程序。 利用Visual C++实现串行通信有两种方法:① 直接调用Win 32 API (Application Program Interface)函数;② 使用ActiveX控件。本文中直接调用了Win 32 API函数进行具体程序设计。 一、 通信系统硬件结构 PC机通常有两个可编程通用异步收发器(UART)与外部D型插座相连,即COM1口和COM2口,通信协议为RS\ 232C。本文的实例是一台微机和数字语音记录仪进行串行通信。数字语音记录仪的核心处理器是Analog Devices公司生产的定点DSP(Digital Signal Processing)芯片ADSP\ 2181。该串行通信系统硬件结构如图1所示,其中虚框所示为数字语音记录仪。由于ADSP\ 2181的UART为TTL电平,故在记录仪中使用了MAX232芯片进行RS\ 232C电平和TTL电平之间的转换。 图1串行通信系统硬件系统结构二、 通信程序设计 1 串行通信程序设计基本原理 Windows 98系统函数包含支持通信中断的功能,它为每个通信设备开辟了用户定义的输入输出缓冲区(即读/写缓冲区),数据进出通信口均由系统后台来完成;应用程序只需要完成对输入输出缓冲区的操作即可。实际过程是每接收一个字符就产生一个低级硬件中断,然后由Windows 98系统中的串行驱动程序取得控制权,并将接收到的数据放入输入数据缓冲区,接着将控制权返还给正在运行的应用程序。如果输入缓冲区数据已满,串行驱动程序用当前定义的流控制机制通知发送方停止发送数据,队列中的数据按“先进先出”的次序处理。具体步骤如下: (1) 照协议的设置初始化并打开串口,通知Windows本应用程序需要使用这个串口,并封锁其它程序使其不能使用此串口; (2) 配置该串口; (3) 在串口上往返传输数据,并在传输过程中进行校验; (4) 不需要此串口时,释放串口以供其它应用程序使用。 Windows 98提供了很强的通信功能,其通信功能主要体现在Win 32通信API函数。对串行通信设备,Win 32 API可支持同步和异步两种I/O操作。同步操作方式程序设计相对比较简单,异步操作方式适合于同时对一个串口设备进行读/写操作和多个串口设备进行I/O操作的情况。考虑本文的具体实例,我们针对同步操作方式给出具体的通信程序设计。 2 串行口初始化 我们分别就语音记录仪端和PC端给出具体程序。数字语音记录仪的核心处理器为ADSP\ 2181,其源程序用ADSP汇编语言编写。PC端的源程序用Visual C++ 6.0编写。 (1) PC机串行口初始化程序 Windows 98下把串行口作为设备文件,对串口操作就是对文件操作。首先,通过CreateFile函数获得串口设备的句柄,利用SetupComm设置缓冲区,再填充DCB(设备控制块)结构的成员,如波特率、校验、数据位、停止位等,进行通信参数的设置。然后,使用SetCommState初始化串行口。 HANDLE m_idComDev=0;//串行设备句柄 BOOL SComm::InitiateCom(void) { DCB dcb ; COMMTIMEOUTS CommTimeOuts ; if((m_idComDev=CreateFile('COM1',GENERIC_READ GENERIC_WRITE,0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL FILE_FLAG_OVERLAPPED,NULL )) ==(HANDLE) -1) return(FALSE); else { SetCommMask(m_idComDev, EV_RXCHAR); SetupComm(m_idComDev, 102400, 102400) ; //设置 //输入输出缓冲区 PurgeComm(m_idComDev, PURGE_TXABORT PURGE_RXABORT PURGE_TXCLEAR PURGE_RXCLEAR );//清除缓冲区内容 /*设置超时控制结构CommTimeOuts中各项参数*/ SetCommTimeouts(m_idComDev,& CommTimeOuts); } GetCommState(m_idComDev, &dcb); /*修改各项DCB参数;*/ SetCommState(m_idComDev, &dcb); } // end of InitiateCom (2) ADSP\ 2181串行口初始化程序 采用定时器产生中断。其中CRYSTAL_FREQ_IN_kHz为ADSP\ 2181的晶振频率,单位:kHz。串行通信波特率=115.2kbit/s。 .constCRYSTAL_FREQ_IN_kHz=16384; .constPERIOD =(CRYSTAL_FREQ_IN_kHz * 2000 /(3 * 115200)) - 1; .constSystem_Control_Reg=0x3fff; initiate_uart: ax0=PERIOD;dm(TCOUNT)=ax0; dm(TPERIOD)=ax0;/*设置定时器,以三倍波特率产生定时中断*/ ax0=0; dm(TSCALE)=ax0;/*TCOUNT、TPERIOD、 TSCALE为定时控制寄存器*/ set flag_out;/*UART发送端初始化为高电平*/ ifc=b#00000011111111;/*禁止中断嵌套*/ ax0=b#0000100000000000; ay0=dm(System_Control_Reg); ar=ax0 or ay0; ay0=b#1111101111111111; ar=ar and ay0; dm(System_Control_Reg)=ar;/*打开并设置 SPORT1为串行口*/ ax0=imask; ay0=b#0000000001; ar=ax0 or ay0; imask=ar;/*打开定时器中断*/ ena timer;/*定时器开始工作*/ rts; 3 数据发送和数据接收 (1) 事件监视:在串口工作时,使用事件监视线程对串口事件进行监视。本例中为“接收到字符”事件。 DWORD Scomm::COMWaitEvent(void) { DWORD dwEvtMask=0; WaitCommEvent(m_idComDev, &dwEvtMask, NULL); return (dwEvtMask); } (2) 数据接收:调用ReadFile函数。 ReadFile(m_idComDev, lpRByte, dwBytesToRead,&dwBytesRead, &m_osRead); 其中参数分别表示:设备句柄、接收缓冲区指针、待读取的字节数、实际读取的字节数等。 (3) 数据发送:调用WriteFile函数。 WriteFile(m_idComDev,lpWByte, dwBytesToWrite, &dwBytesWritten, &m_osWrite); 其中参数分别表示:设备句柄、发送缓冲区指针、待发送的字节数、实际发送的字节数等。 4 关闭串口设备 当应用程序结束或不再使用串口设备时,应将串口设备关闭,包括取消事件监视、清除缓冲区、关闭设备句柄等。PC机关闭串行设备的程序如下: BOOL SComm::COMShutDown(void) { PurgeComm(m_idComDev, PURGE_TXABORT PURGE_RXABORT PURGE_TXCLEAR PURGE_RXCLEAR);//停止 //发送接收数据,清除缓冲区 SetCommMask(m_idComDev, 0);//取消时间监视 CloseHandle(m_idComDev);//关闭设备句柄 } ADSP\ 2181关闭串行口只需要屏蔽定时中断即可。 5 语音转存系统 图2所示是我们在串行通信程序基础上开发的语音转存系统的界面。 图2语音转存系统界面语音转存系统的目标是将记录仪中的语音数据传送到PC机上。记录仪到PC机的转存主要实现读系统参数、读索引信息、读语音数据块以及写入16字节的机器编码等功能。PC完成的功能主要是索引的分析、显示、选择,语音数据以文件形式保存和根据时间进行语音数据块的定位。另外,还可以通过我们研制的专门的硬件插卡播放语音文件。串行口传输波特率为115.2kbps。PC机(或笔记本电脑)可以提取、编辑设置记录仪的16字节编码,该16字节编码是每台记录仪惟一的。 结束语 应用API函数,结合Visual C++6.0的可视化开发环境以及多线程技术,我们已经完整地编写、调试并通过了微机和数字语音记录仪之间的语音转存程序(基于串行通信)。该数字语音记录仪的软硬件均已通过测试,并已作为产品推出。它用来对电话线路上的语音信号进行实时采集与处理。主要应用于自动监控领域,如监测铁路通信等。MES 参考文献 1陈坚,孙志月.MODEM通信编程技术.西安:西安电子科技大学出版社,1998 2Kruglinski J David,George Shephard.Microsoft C++ 60技术内幕.北京:北京希望电子出版社,1999 3ADSP\ 2181 Data Sheet, Analog Devices
标签:
来源:单片机与嵌入式系统应用 作者:中国科学技术大学 李鹏怀 戴礼荣 王仁华 李枫 时间:2006/2/12 0:00:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐