接下来的工作就是对数据的发送与接收了,这也是本文所要介绍的重点所在。发送数据的代码原则上是可以写到一个成员函数中被直接调用的,但这并不是一个良好的编程习惯:我们应当把比较耗时的操作,如文件拷贝、打印、端口传输等工作放到一个单独的线程当中,以避免其在工作时会引起整个进程的阻塞,以提高整个系统对CPU的利用率。例如我们可以在视类中菜单或按钮的响应函数中用AfxBeginThread(WriteProc,this)函数来开启一个名为"WriteProc"的线程,由于在线程中还需要使用视类的函数和变量,为了不产生新的视类的实例对象,我们通过该函数的第二个参数将指向当前的视类的指针this作为参数传递给线程。在线程中可以用如下两种方法之中的一种调用视类的成员函数:
((COLECommView*) pParam)->DoSendProc(); |
或是:
COLECommView* view=(COLECommView*) pParam; View->DoSendProc();
|
其中从pParam传来的变量就是指向视类的指针。在线程中通过调用视类中的DoSendProc函数来完成对数据的发送,正是由于该函数是被全局的线程所调用的,我们就不可以使用取编辑框上的数据时通常所用的UpdateData()函数了,取而带之的是API 函数GetDlgItemText(),取到输入的数据后通过控件的SetOutput() 方法就把数据从串口发出去了,其中发送数据必须经ColeVariant类将其转换为通用的VARIANT型变量。实现 主要代码如下:
…… char a[255]; HWND hwnd=GetSafeHwnd(); ::GetDlgItemText(hwnd,IDC_EDIT1,a,255); int i=0; CString str; while(a[i]!='/0') { str.Format("%c",a[i]); m_SendData+=str; i++; } str.Format("%c",10); m_SendData+=str; m_Comm.SetOutput(COleVariant(m_SendData)); …… |
至于数据的接收,我们可以通过让MS Comm控件响应其OnComm事件来完成,通过ClassWizard加入其对事件的响应后,通过下面的事件映射,当有字符到达时便会通知 OnComm()函数去处理,从而实现数据的异步接收:
…… BEGIN_EVENTSINK_MAP(COLECommView, CFormView) //{{AFX_EVENTSINK_MAP(COLECommView) ON_EVENT(COLECommView, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() …… void COLECommView::OnComm() { VARIANT Input; if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符 { Input=m_Comm.GetInput();//读取缓冲区内的数据 CString msg=Input.bstrVal; CString str; str.Format("%c",10); if(msg.Right(1)==str) { m_RecvData+=msg; m_History.AddString(m_RecvData); m_RecvData=""; } else m_RecvData+=msg; } }
|
当数据被接收到接收缓冲区后,对于字符可以从VARIANT型结构变量的bstrVal成员变量中获取,VARIANT数据结构相当复杂,并牵扯到COM(Component Object Model,组件对象模型)中的一些概念,具体详情请参阅Microsoft Corpration发布的MSDN中的有关论述。
三、 测试与实验
编译运行程序之前有必要对机器的端口做一番检查,以确保端口的完好,可以用常见的DOS程序Comdebug来检查。在确认串口工作正常后,可用串口线将两台机器的串口相连,同时在两台机子上运行该程序,如果没有条件也可只用一台微机,将其串口的2脚和3脚短接,使其处于自发自收状态。经过数据的传输实验证明该程序是可靠、正确的。
小结:利用通讯控件可以很容易的编写出串行通信程序。但相对来说通讯控件在VC中的使用要比在VB、Delphi中复杂的多,要想对串口通讯开发出更多更灵活的使用方法还需要不断的实践中摸索。本程序在 Windows 98下,由Microsoft Visual C++ 6.0编译通过。 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |