3676|0

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WaitCommEvent不能超时? [复制链接]

大侠们,我的串口打开后,CreateThread(。。。)//读线程时,其中运行到WaitCommEvent(..)好像就死了,
if (OpenSerialport((char*)(LPCTSTR)strport,57600))
        {
                MessageBox(_T("串口打开失败"),_T("查询机"),MB_OK);
                return FALSE;
        }
        if (!(m_hReadThread  = CreateThread(NULL,0,ReadThread,(void*)m_hSerialport,0/*STACK_SIZE_PARAM_IS_A_RESERVATION*/,&pid)))
        {
                MessageBox(_T("读线程建立失败"),_T("查询机"));
        }

//读线程
DWORD ReadThread(LPVOID param)
{
        HANDLE hport = (HANDLE)param;
        DWORD rcount;
        TSBYTE buf[100];
        TSBYTE rcvmsg[ARRLEN];
        DWORD dwev;
        int rdold = 0;
        int flag = 0;
        int datalen = 0;
        ParseData *psdt;
        DWORD pid,commerrs;
        COMSTAT commstat;

        PurgeComm(hport, PURGE_TXCLEAR);                 //Clears the output buffer

        DWORD StartTime = GetTickCount();                // record the start time

        if (hport == INVALID_HANDLE_VALUE ) return -1;
//
        SetCommMask(hport,EV_RXCHAR);

        while(hport != INVALID_HANDLE_VALUE )
        {
                //MessageBox(g_hwnd,_T("ReadThreadA"),_T("test"),MB_OK);
                ClearCommError(hport,&commerrs,&commstat);
                WaitCommEvent(hport,&dwev/*EV_RXCHAR*/,NULL);
                SetCommMask(hport,EV_RXCHAR);
                MessageBox(NULL,_T("ReadThreadD"),_T("test"),MB_OK);
                if (dwev & EV_RXCHAR)
                {
                        do
                        {
                                //MessageBox(g_hwnd,_T("ReadThreadB"),_T("test"),MB_OK);
                                ReadFile(hport,buf,100,&rcount,NULL);
                                //MessageBox(g_hwnd,_T("ReadThreadC"),_T("test"),MB_OK);
#ifdef _DEBUG
                                //printf("read before read times sof :%s\n",SOF);
                                for (int i = 0; i < rcount; i ++)
                                        printf("read count :%d%02x\n",rcount,buf);
#endif
                                if ((buf[0] == SOF) && !flag)
                                {       
#ifdef _DEBUG
                                        printf("sof %d<%d>\n",rcount,buf[1]);
#endif
                                        datalen = (buf[1] << 8) + buf[2];
                                        break;
                                        memcpy(rcvmsg, buf,rcount);
                                }
                                else
                                {
                                        if (flag)
                                        Byte2In1(rcvmsg, buf, rdold, rcount);
                                    else
                                            break;
                                }
                                flag++;
                                rdold += rcount;
                        }while(!rcount || (rdold >= datalen));
                }
               
                if (rcount > ARRLEN)
                {
                        memset(buf,0,ARRLEN);
                        continue;
                }
                switch(rcvmsg[3])
                {
                case 0x0A:
                //#ifdef _DEBUG
                        //printf("in pars01\n");
                //#endif
                        //parse01(rd,msg);
                        break;
                case 0x02:
#ifdef _DEBUG
                        printf("in pars02\n");
#endif
                        psdt->len = rdold;
                        memcpy(psdt->mem ,rcvmsg, rdold);
                        //PostMessage(g_hwnd..
                        CreateThread(NULL,0,parse02,(void*)psdt,STACK_SIZE_PARAM_IS_A_RESERVATION,&pid);//parse02(rdold,rcvmsg);
                        PurgeComm(hport, PURGE_TXCLEAR | PURGE_RXCLEAR);                 //Clears the output|input buffer
                        break;
                case 0x01:
                //#ifdef _DEBUG
                        //printf("pars03 inventory\n");
                //#endif
                        //parse03(rd,msg);
                        break;
                }
                Sleep(50);
        }
        return 0;
}
请帮帮我吧
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖探索 | 和村田一起,深挖 GNSS 开发!
活动时间:即日起-5月11日
活动奖励:智能手环、螺丝刀套装、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表