我的实时监控软件中使用串口通讯方式不断从监控设备中采集数据,我使用的是微软自带的mscomm控件,在主线程中使用我会,可是我的主线程要干好多事,包括视图的不断刷新,数据的处理等,我现在想把串口通讯收发做为单独的线程来处理,不知如何做,请高手指教,先谢了。

解决方案 »

  1.   

    在主线程会做 多线程不会做
    调用下CreateThread
    把你实现串口通信的代码放到线程函数还不就得了
      

  2.   

    mscomm的使用方式=================
    1.2.查询法 (可以在辅助线程应用)  这种方法适合于较小的应用程序。在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性以检查执行结果或者检查某一事件是否发生。例如,当程序向串行设备发送了某个
    命令后,可能只是在等待收到一个特定的响应字符串,而不是对收到的每一个字符都立刻响应并处理。 
    task{
      while(1){
       m_comm.GetCommEvent(); 
     }
    }2.事件驱动法在使用事件驱动法设计程序时,每当有新字符到达、端口状态变化或发生错误时,MSComm控件将解发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。这种方法的优点是程序响应及时,可靠性高。 添加接收数据函数,在对话框中双击Comm Control,接受默认函数,则对话框类的成员函数为OnCommMscomm(),添加代码如下:
    Sleep(500);   //视各厂家modem而定。不加则数据接受不全 
    VARIANT m_input; 
    char *str,*str1; 
    int k,nEvent,i,len,m; 
    CString str2; 
    m_ReceiveData=""; 
    nEvent=m_comm.GetCommEvent(); 
    switch(nEvent) 

    case 2:                               //收到大于RTHresshold个字符 
    k=m_comm.GetInBufferCount();      //接收缓冲区的字符数目 
    if(k>0) 

            m_input=m_comm.GetInput(); 
            str=(char*)(unsigned char*)m_input.parray->pvData; 

    ?i=0; 
    str1=str; 
    while(i<k) 

            i++; 
            str1++; 

    *str1=''\0'';                               
    str2=(const char*)str;              //清除字符串中的不必要字符 
    m_ReceiveData=(const char *)str; 
    break; 
    case 3:        //CTS线状态发生变化 
    break; 
    case 4:        //DSR线状态发生变化 
    break; 
    case 5:        //CD线状态发生变化 
    break; 
    case 6:        //Ring Indicator发生变化 
    break;