我在基于对话框的一个函数里创建了一个辅助线程,然后想在辅助线程里进行串口通信,在线程响应函数里,我设了一个时钟,用SetTimer作的,然后用处理消息的方法捕捉WM_TIMER消息,一旦捕捉到,就往串口送字符,测试发现串口OnComm函数可以响应,现在发现两个问题,一个是程序在下列代码“//****”处加上这句,加了消息框运行时很多情况下程序运行时没事,偶而也会死,但把消息框去掉,则程序容易死,执行一半旧出现关闭对话框,单步执行发现执行到“//****”这句时每事,在下去旧有问题,这是为什么?还有一个问题是:OnComm函数在静态采集串口是没有什么问题,比如仪表显示“189”,打开串口采集静态值189没有问题,但放到辅助线程里。OnComm函数响应了,但发现采集近来的数是“1”,“8”,“9”,就是每次只能采集到一位。这是为何?以下是辅助线程函数:
UINT Cscxtdlg::ComThreadProc(LPVOID pParam)
{
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
BOOL bRet;
int count=0;
Cscxtdlg* pointer;
char char1='B';
char char2='\n';
CByteArray array;
array.RemoveAll();
array.SetSize(2);
array.SetAt(0,char1);
array.SetAt(1,char2);
pointer = (Cscxtdlg*)pParam;
if(pParam==NULL)
AfxEndThread(NULL);
UINT htimer=::SetTimer(NULL,1,100,NULL);
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
        if (bRet == -1)
{
break;
}
if(msg.message==WM_TIMER)
{
Sleep(100);
count++;//*****
AfxMessageBox("11");
pointer->m_ComPort.SetOutput(COleVariant(array));
if(count>20)
{
CString str;
    str.Format("%d",count);
                               AfxMessageBox(str);
    break;
}
}
else
{
TranslateMessage(&msg); 
DispatchMessage(&msg); 
}
}
    ::KillTimer(NULL,htimer);
    return 0;//结束线程
}

解决方案 »

  1.   

    在定时器或线程中千万别用MessageBox,呵呵;
    定时器和自定义线程不要一起用来处理一个监控;他们之间通讯容易出事;要么多定时器,要么多线程;你的array只有两个元素:
    array.SetSize(16);看看收到的值是不是"189"Good Luck
      

  2.   

    to :nbgyf(小蜜蜂)
    我的array是用来得到一个“B\n"字符串,和实际接收过程没有关系,根据串行通信协议,必须先给串口送这个字符串,串口才能响应往输入缓冲区送数,
    但静态采集串口是没有问题,所以也不是OnComm函数中数据处理的问题,是不是串口只往输入缓冲区送了一位数?而且如果我把*****下面这句语句:AfxMessageBox("11");去掉,则程序一运行就死,真搞不懂?
      

  3.   

    我怎么以正常的方式上不来?网叶上的提示是:无法显示 XML 页。 
    使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。 
    --------------------------------------------------------------------------------XML 文档必须有一个最上层元素。 
    着是为什么?
      

  4.   

    我怎么以正常的方式上不来?网叶上的提示是:无法显示  XML  页。    
    使用  样式表无法查看  XML  输入。请更正错误然后单击  刷新按钮,或以后重试。    
     
     
    --------------------------------------------------------------------------------  
     
    XML  文档必须有一个最上层元素。    
    着是为什么?
      

  5.   

    为什么要用TIMER呢?如果你没有点 MESSAGEBOX TIMER 实际还在远行,不停的弹出来了我想你不如做个信号量,设定等待 时间就是你要设定的 TIMER 时间,使用超时后处理,例如while(bNotExit)
    {
        WaitforSingleObject(hSendMutex,1000);    //超时后发送数据
        
        。。    //等待仪器发送数据
        Delay() 自已写一个延时的函数,不要用 SLEEP    //等待时间和传送的速率,数据量有关
        //例如:1200,n,8,1 下发送 58 字节要等 800 ~ 1000 毫秒
        
        
        //接收数据
        ...}
      

  6.   

    你的网络慢;---------------------------------------------------
    对于你的问题,俺只能关注;
    俺用TIMER和THREAD混合编程,就出错,以后一直没用;------------------------------------------------
    你去  硬件/系统  论坛去问问吧
    GOOD  LUCK