高分寻求使用微软串口控件mscomm在辅助线程中的使用方法 我的实时监控软件中使用串口通讯方式不断从监控设备中采集数据,我使用的是微软自带的mscomm控件,在主线程中使用我会,可是我的主线程要干好多事,包括视图的不断刷新,数据的处理等,我现在想把串口通讯收发做为单独的线程来处理,不知如何做,请高手指教,先谢了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在主线程会做 多线程不会做调用下CreateThread把你实现串口通信的代码放到线程函数还不就得了 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; } 关于OnPaint和OnDraw函数的关系 如何创建一个托盘,像qq那样有消息的时候闪动 客户端传递'\0'不能被接收吗? 怎样使List Control控件中某些单元格具有Combo Box 的功能? 我用mfc生成的Activex为什么不能嵌入到网页中,谁能帮我解决给500分 新手问:关于消息机制的入门级问题 有关打印的问题. 请教mfc画图 我是一个初学者,请问用 MFC appWizard创建的对话框程序的入口在哪里?? CMap 如何使用自定义的类作为key? 急求:ctrl+F5 F5 每次运行结果各不相同 在pc上如何编程控制activesync的连接设置
调用下CreateThread
把你实现串口通信的代码放到线程函数还不就得了
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;
}