基于VB的DSP 与PC机的串行通信
- 格式:doc
- 大小:226.51 KB
- 文档页数:18
基于VB的DSP 与PC机的串行通信摘要:要实现对现代变压器特性试验仪的数据处理和分析, 必须解决PC 机和DSP 的串行通信问题。
文中介绍了基于Visual Basic6. 0 的DSP 与PC 机的串行通信, 构建了两者的串行通信体系结构, 并通过具体的实例给出了DSP 与PC 机之间串行通信的方法。
结果表明, 该方法简单有效、功能强大, 方便地实现了PC 机和DSP 之间的通信, 借鉴性高。
关键词:串行通信; DSP;DSC计算机技术在工业控制领域的运用越来越广泛,往往需要由一台主机去控制多台从机,当上位机距离下位机较远时,就需要使用串行数据通信。
串行通信由于具有通信线路简单,数据传输可靠等优点,在工业控制。
数据采集和实时控制等场合得到了广泛的运用。
其中, DSP 主要进行对数据的实时采集、处理、控制, 再通过串口将数据送入PC 机的缓冲区, 然后由PC 机对数据进行进一步处理, 以便得到所需的图形、图像及实验结果。
采用VB 语言中的通信控件MSComm 能够很好地完成二者之间的通信功能。
1.系统简介近年来,随着集成电路技术和制造工艺的突飞猛进,推动了数字信号处理方法和运用的研究。
告诉数字信号处理方法和运用的研究。
告诉数字信号处理技术的发展及其制造成本的降低,使数字信号处理技术在电力系统的各个研究领域得到了广泛的运用,DSP技术被运用于某些电力产品的开发研究中。
TMS320F2812 DSP是美国德州仪器公司最新推出的数字信号处理器之一,其运算精度达到了32位,处理能力达到150MI/S,从而大大改善了运用的灵活性,尤其是为电机及其他运动控制领域的运用提供了良好的平台。
CCS是TI公司推出的用于各个系列DSP芯片的集成开发坏境,它采用了Windows风格的界面,集编辑,翻译,链接,软件仿真,硬件调试以及实时跟踪等功能于一体,极大的方便了程序的设计和开发。
在使用CCS前首先要在PC机上进行安装,在安装完毕后,就可以通过Setup CCS设置硬件和软件,在进入CCS环境进行编辑或修改。
2.通信原理和方法上位机首先向DSP 发出接收数据的指令, DSP 接收到来自上位机的指令后, 进行判断, 看其是否正确。
如果正确, 则向上位机传送数据( 包含首尾校验字节) ; 否则, DSP 拒绝向上位机传送数据。
上位机接收到DSP 传来的数据后同样要判断正确与否, 如果正确, 则接收, 否则拒绝接收。
DSP 接收到此指令后, 进行判断, 如果正确, 则向上位机发送相应的组数据2 次;如果不正确, DSP 则处于等待状态, 不发送数据。
上位机收到来自DSP 的数据后, 首先进行数据校验, 如果校验成功( 即接收到的两组数据相同) , 则说明接收到的数据是正确的, 从而可以进行处理, 否则拒绝接收, 并显示相关警告信息。
3.VC编写串口程序的方法和流程1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。
选择Microsoft Communications Control, version 6.0,,单击Insert 按钮将它插入到Project中来,接受缺省的选项。
这时在ClassView视窗中就可以看到CMSComm类了,并且在控件工具栏Controls中出现了电话图标,用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard ->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时在对话框头文件中自动加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES 。
4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
将接收编辑框的Properties->Styles中把Miltiline 和Vertical Scroll属性选上。
再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_EDIT_RXDATA添加CString变量m_strRXData,为IDC_EDIT_TXDATA添加CString变量m_strTXData。
说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。
5.添加串口事件消息处理函数OnComm() 打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。
这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。
请你在函数中加入如下代码:void CSCommTestDlg::OnComm(){// TODO: Add your control notification handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp;if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符{ ////////以下你可以根据自己的通信协议加入处理代码variant_inp=m_ctrlComm.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++)safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 {BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strRXData+=strtemp; //加入接收编辑框对应字符串}}UpdateData(FALSE); //更新编辑框内容}到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。
没错吧?那么做下一步:6.打开串口和设置串口参数你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。
现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:// TODO: Add extra initialization hereif(m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1); //选择com1 if( !m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(TRUE);//打开串口elseAfxMessageBox("cannot open serial port");m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0 m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据现在你可以试试程序了,将串口线接好后(不会接?去看看我写的串口接线基本方法),打开串口调试助手,并将串口设在com2,选上自动发送,也可以等会手动发送。
再执行你编写的程序,接收框里应该有数据显示了。
7.发送数据先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:void CSCommTestDlg::OnButtonManualsend(){// TODO: Add your control notification handler code hereUpdateData(TRUE); //读取编辑框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据}运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在另一端的串口调试助手(或别的调试工具)接收框里出现了什么。
最后说明一下,由于用到VC控件,在没有安装VC的计算机上运行时要从VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目录下的System子目录中(win2000为System32)4.DSC控制UART芯片的机制异步串口通信协议,工作原理是将传输数据的每个字符以串行方式一位接一位的传输.UART工作原理其中每一位(bit)的意义如下:起始位:先发出一个逻辑“0”的信号,表示传输字符的开始。