3000|5

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

唉,又来问人了!流驱动的测试程序,最简单的也没搞定 [复制链接]

最近写了一个rtc驱动,驱动加载没问题,而且关机后rtc也能跑起来,但是要对rtc进行读写,所以在RTC_IOControl里实现,但是测试程序能CreateFile打开,但是在调用DeviceIoControl始终返回失败,无法对rtc进行读写。下面对驱动中的RTC_IOControl。
BOOL RTC_IOControl(DWORD hOpenContext,
                   DWORD dwCode,
                   PBYTE pBufIn,
                   DWORD dwLenIn,
                   PBYTE pBufOut,
                   DWORD dwLenOut,
                   PDWORD pdwActualOut)
{
//   int nIndex=0;
    BOOL bRet = FALSE;
SYSTEMTIME* st;
BYTE bBufIn[6] ;
BYTE bBufOut[6];
//INT iResult;
// WORD* wData;
// BYTE bySlaveAddr = 0x32;
        InitializeCriticalSection(&RTC_critsect);
    RETAILMSG(RTC_DEBUG,(TEXT("ioctrl: RTC_IOControl, Code: %x\r\n"), dwCode));
        switch(dwCode)
        {
        case RTC_WRITE_CURRENT_TIME:
                EnterCriticalSection(&RTC_critsect);
                st = (SYSTEMTIME*)pBufIn;
              memset(bBufIn, 0, 6);
                TimestoBCD(st, bBufIn);
                Write_SD2068(hI2C, RTC_I2C_ADDRESS, bBufIn);
                bRet = TRUE;
                LeaveCriticalSection(&RTC_critsect);
                break;
               
        case RTC_READ_CURRENT_TIME:
                //st = (SYSTEMTIME*)pBufOut;
                EnterCriticalSection(&RTC_critsect);
                st = NULL;
                st->wMilliseconds = 0;
              memset(bBufOut, 0, 6);
                Read_SD2068( hI2C, RTC_I2C_ADDRESS, bBufOut);
                BCDtoTimes(bBufOut, st);
                pBufOut = (PBYTE)st;
                bRet = TRUE;
                LeaveCriticalSection(&RTC_critsect);
                break;
               
        default:
                break;
        }


    return bRet;
}
以下为DeviceIoControl函数。
void CRTC_testDlg::OnBtnWriteRtc()
{
        // TODO: Add your control notification handler code here
        BOOL bWrite;
        UpdateData(TRUE);
        m_sysTime.wYear = m_uYear;
        m_sysTime.wMonth = m_uMonth;
        m_sysTime.wDay = m_uDay;
        m_sysTime.wHour = m_uHour;
        m_sysTime.wMinute = m_uMin;
        m_sysTime.wSecond = m_uSec;
       
                if(!m_hRTC)
        m_hRTC = CreateFile(TEXT("RTC1:"),                              // name of device
                                GENERIC_READ|GENERIC_WRITE,              // desired access
                                FILE_SHARE_READ|FILE_SHARE_WRITE,     // sharing mode
                                NULL,                                                             // security attributes (ignored)
                                OPEN_EXISTING,                                        // creation disposition
                                NULL,                  // flags/attributes
                                NULL);

                if (m_hRTC == INVALID_HANDLE_VALUE)
                {
                        RETAILMSG(1, (TEXT(" CreateFile for RTC failed!\r\n")));
                        MessageBox(TEXT("m_hRTC is failed! "), NULL, MB_OK);
                }
                else
                        MessageBox(TEXT("m_hRTC is OK! "), NULL, MB_OK);


        if(!SetSystemTime(&m_sysTime))
                MessageBox(TEXT("SetSystemTime is failed! "), NULL, MB_OK);

        if(m_hRTC)
                bWrite = DeviceIoControl(m_hRTC, RTC_WRITE_CURRENT_TIME, &m_sysTime, sizeof(SYSTEMTIME), NULL, 0, NULL,NULL);
        else
                MessageBox(TEXT("m_hRTC is failed! "), NULL, MB_OK);

        if(!bWrite)
        {
                MessageBox(TEXT("bWrite is failed! "), NULL, MB_OK);
                RETAILMSG(1,(TEXT("DeviceIoControl Write is error!")));
        }
}

最新回复

搞定了,放了几天没去管,今天有一个同事来问,就再去看看,结果发现在init的时候返回的句柄有问题,应用程序不认。。  详情 回复 发表于 2009-6-22 19:25
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
既然驱动都已经加载了,那你可以定位到出现问题的位置,然后设法解决问题。


到底是流驱动结构的问题,还是读写硬件的问题,这个可以通过输出调试信息判断出来。
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 zaodt 的回复:
既然驱动都已经加载了,那你可以定位到出现问题的位置,然后设法解决问题。


到底是流驱动结构的问题,还是读写硬件的问题,这个可以通过输出调试信息判断出来。



正解,你可以按你认为的rtc读写顺序来添加打印信息,这样很容易发现问题的。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

4
 
程序执行到DeviceIoControl后,bWrite 为false。
bWrite = DeviceIoControl(m_hRTC, RTC_WRITE_CURRENT_TIME, &m_sysTime, sizeof(SYSTEMTIME), NULL, 0, NULL,NULL);
驱动是正常跑起来的,调用驱动中的
BOOL RTC_IOControl(DWORD hOpenContext,
                  DWORD dwCode,
                  PBYTE pBufIn,
                  DWORD dwLenIn,
                  PBYTE pBufOut,
                  DWORD dwLenOut,
                  PDWORD pdwActualOut)

接口后,没有输出驱动中的任何调试信息,这条语句 RETAILMSG(RTC_DEBUG,(TEXT("ioctrl: RTC_IOControl, Code: %x\r\n"), dwCode)); 根本就没执行。以前没有添加RTC_critsect临界区效果一样

rtc没有问题,我在rtc的init中单独创建一个线程去定时读写rtc上的值,都能看到rtc上的值的变化,并且关机后,系统再启动,也能够保存rtc上的值,并且时间也是准确的。


 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
RTC_IOControl

这个函数导出了没有?


就是在 def 文件中导出了没有?
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
搞定了,放了几天没去管,今天有一个同事来问,就再去看看,结果发现在init的时候返回的句柄有问题,应用程序不认。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表