3033|3

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助~~~~~~~~~~~~~ [复制链接]

BOOL CCESeries::OpenPort(CWnd* pPortOwner,/*使用串口类,窗体句柄*/
                        UINT portNo,/*串口号*/
                        UINT baud,/*波特率*/
                        UINT parity,/*奇偶校验*/
                        UINT databits,/*数据位*/
                        UINT stopbits/*停止位*/
                        )
{
        DCB commParam;
        TCHAR szPort[15];       
       
        // 已经打开的话,直接返回
        if (m_hComm != INVALID_HANDLE_VALUE)
        {
                return TRUE;
        }
        ASSERT(pPortOwner != NULL);
        ASSERT(portNo > 0 && portNo < 5);
       
        //设置串口名
        wsprintf(szPort, L"COM%d:", portNo);
        //打开串口
        m_hComm = CreateFile(
                szPort,
                GENERIC_READ | GENERIC_WRITE,        //允许读和写
                0,        //独占方式(共享模式)
                NULL,
                OPEN_EXISTING,        //打开而不是创建(创建方式)
                0,
                NULL
                );
       
        if (m_hComm == INVALID_HANDLE_VALUE)
        {
                // 无效句柄,返回。               
                TRACE(_T("CreateFile 返回无效句柄"));
                return FALSE;
               
        }
       
        // 得到打开串口的当前属性参数,修改后再重新设置串口。
        // 设置串口的超时特性为立即返回。
       
        if (!GetCommState(m_hComm,&commParam))
        {               
                return FALSE;
        }
       
        commParam.BaudRate = baud;// 设置波特率
        commParam.fBinary = TRUE;// 设置二进制模式,此处必须设置TRUE
        commParam.fParity = TRUE;// 支持奇偶校验
        commParam.ByteSize = databits;// 数据位,范围:4-8
        commParam.Parity = NOPARITY;// 校验模式
        commParam.StopBits = stopbits;// 停止位
       
        commParam.fOutxCtsFlow = FALSE;        // No CTS output flow control
        commParam.fOutxDsrFlow = FALSE;        // No DSR output flow control
        commParam.fDtrControl = DTR_CONTROL_ENABLE;
        // DTR flow control type
        commParam.fDsrSensitivity = FALSE;// DSR sensitivity
        commParam.fTXContinueOnXoff = TRUE;// XOFF continues Tx
        commParam.fOutX = FALSE;// No XON/XOFF out flow control
        commParam.fInX = FALSE;        // No XON/XOFF in flow control
        commParam.fErrorChar = FALSE;// Disable error replacement
        commParam.fNull = FALSE;// Disable null stripping
        commParam.fRtsControl = RTS_CONTROL_ENABLE;
        // RTS flow control
        commParam.fAbortOnError = FALSE;// 当串口发生错误,并不终止串口读写
       
        if (!SetCommState(m_hComm, &commParam))
        {
                TRACE(_T("SetCommState error"));               
                return FALSE;
        }
       
       
    //设置串口读写时间
        COMMTIMEOUTS CommTimeOuts;
        GetCommTimeouts (m_hComm, &CommTimeOuts);
        CommTimeOuts.ReadIntervalTimeout = MAXDWORD;  
        CommTimeOuts.ReadTotalTimeoutMultiplier = 0;  
        CommTimeOuts.ReadTotalTimeoutConstant = 0;   
        CommTimeOuts.WriteTotalTimeoutMultiplier = 10;  
        CommTimeOuts.WriteTotalTimeoutConstant = 1000;  
       
        if(!SetCommTimeouts( m_hComm, &CommTimeOuts ))
        {
                TRACE( _T("SetCommTimeouts 返回错误") );
                return FALSE;
        }
       
        m_pPortOwner = pPortOwner;       
       
        //指定端口监测的事件集
        SetCommMask (m_hComm, EV_RXCHAR);
       
        //分配设备缓冲区
        SetupComm(m_hComm,512,512);
       
        //初始化缓冲区中的信息
        PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
       
        m_hReadCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
        m_hWriteCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
        //创建读串口线程
        m_hReadThread = CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);
        //创建写串口线程
        m_hWriteThread = CreateThread(NULL,0,WriteThreadFunc,this,0,&m_dwWriteThreadID);
       
        TRACE(_T("串口打开成功"));
       
        return TRUE;
}


//串口读线程函数
DWORD CCESeries::ReadThreadFunc(LPVOID lparam)
{
        CCESeries *ceSeries = (CCESeries*)lparam;
       
        DWORD        evtMask;
        BYTE * readBuf = NULL;//读取的字节
        DWORD actualReadLen=0;//实际读取的字节数
        DWORD willReadLen;
       
        DWORD dwReadErrors;
        COMSTAT        cmState;
       
        // 清空缓冲,并检查串口是否打开。
        ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE);
       
       
        //清空串口
        PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );
       
        SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
        while (TRUE)
        {          
                if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
                {                       
                        SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
                        //表示串口收到字符               
                        if (evtMask & EV_RXCHAR)
                        {
                               
                                ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
                                willReadLen = cmState.cbInQue ;
                                if (willReadLen <= 0)
                                {
                                        continue;
                                }
                               
                                readBuf = new BYTE[willReadLen];
                                ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0);
                               
                                //如果读取的数据大于0,
                                if (actualReadLen>0)
                                {
                                        //触发读取回调函数
                                        ceSeries->m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,actualReadLen);
                                }
                        }
                }
                //如果收到读线程退出信号,则退出线程
                if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
                {
                        break;
                }
        }
        return 0;
}

void CWinceSerialCommDlg::OnSeriesRead(CWnd* pWnd,BYTE* buf,int bufLen)
{
        CWinceSerialCommDlg *pDlg = (CWinceSerialCommDlg *)pWnd;
        CEdit * pEdit;
        pEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDTRECV);

        CString strRecv = (char*)buf;
        CString strOld;
        pEdit->GetWindowText(strOld);
        pEdit->SetWindowText(strOld + strRecv);
   
        delete[] buf;
}

为什么wince下串口一直读不到数据啊?高手帮忙啊,急死了~~~

最新回复

lz你好,我想再问一下你的问题解决了没有,我的程序和你的一样,我现在也遇到一个问题,就是我发的数据可以收到,但是每隔15个字节就会有一个字节收不到,不知道是怎么回事??有没有高手遇到过呀????  详情 回复 发表于 2007-12-7 10:51
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
首先要确认硬件,和驱动是否正常。
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼上的怎么确认呢,我现在也在怀疑硬件或者驱动可能有问题。

我用ARM板的时候可以将系统的调试信息打印到串口,通过超级终端看到
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
lz你好,我想再问一下你的问题解决了没有,我的程序和你的一样,我现在也遇到一个问题,就是我发的数据可以收到,但是每隔15个字节就会有一个字节收不到,不知道是怎么回事??有没有高手遇到过呀????
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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