4702|14

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我感觉程序中读写硬件没问题,但为什么却写失败?,大家帮我分析一下 [复制链接]


  1.         MessageBox(_T("111111111111111"),NULL,MB_OK);

  2.         /******************************************/
  3.         *ptPA[0]=0x00[color=#FF0000];//写数据成功[/color]
  4.         RunOrStopFlag=1;
  5.         int pb1,pb4,pb5;       
  6.        
  7.         pb1=((*ptPB[0])&0x0FF[color=#FF0000]);//读数据成功[/color]
  8.         delay(DELAY_TIME);
  9.         if(pb1==0x80||pb1==0x0)
  10.         {
  11.                 JXDlg jxdlg;
  12.                 while(1)
  13.                 {
  14.                        
  15.                         if(jxdlg.DoModal()==IDOK)
  16.                         {
  17.                                 SetTimer(1,m_iCycleTime*1000,NULL);
  18.                                 m_bRunFlag=TRUE;
  19.                                 break;
  20.                         }
  21.                         Sleep(6000);
  22.                        
  23.                 }
  24.         }
  25.         else
  26.         {
  27.                 MessageBox(_T("22222222"),NULL,MB_OK);
  28.                
  29.                 while(1)//循环1
  30.                 {
  31.                        
  32.                         pb1=((*ptPB[0])&0x0FF)&0x07;// X000 &0111= 0000[color=#FF0000]读出数据成功[/color]
  33.                         delay(DELAY_TIME);
  34.                         pa1=pa1|0x1;
  35.                         if(pb1==0)//开关1 2 3按下;A灯亮
  36.                         {
  37.                                 JWdlg jwdlg;
  38.                        
  39.                         //        delay(1000*1000);
  40.                        
  41.                                 *ptPA[0]=pa1;//[color=#FF0000]这里写偶尔成功,偶尔失败,不知道为什么[/color]
  42.                                 delay(1000*1000);                               
  43.                                 if(jwdlg.DoModal()==IDOK)
  44.                                 {
  45.                                        
  46.                                         break;
  47.                                 }
  48.                                
  49.                         }
  50.                 }
  51.                
  52.                
  53.                
  54.                 while(1)//循环2
  55.                 {
  56.                         pb4=((*ptPB[0])&0x0FF)&0x08;//[color=#FF0000]开关4按下;BCD三灯亮,读数据成功[/color]
  57.                         delay(DELAY_TIME);
  58.                         pa1=15;
  59.                         if(pb4==0)
  60.                         {       
  61.                
  62.                                 *ptPA[0]=pa1;//[color=#FF0000]写失败,我感觉程序与上面一段中的写是一样的,但为什么失败[/color]
  63.                                 delay(1000*1000);
  64.                                
  65.                                 MessageBox(_T("3333333333"),NULL,MB_OK);
  66.                                
  67.                                 break;
  68.                         }
  69.                 }
  70.                 while(1)//循环3
  71.                 {
  72.                        
  73.                         pb5=((*ptPB[0])&0x0FF)&0x70;                //读数据也成功
  74.                         delay(DELAY_TIME);
  75.                        
  76.                         if(pb5==0)//开关5 6 7按下,BCD三灯灭,可以开始采集数据
  77.                         {
  78.                                 pa1=pa1|0x01;
  79.                                 *ptPA[0]=pa1;//写数据也失败;
  80.                                 delay(1000*1000);
  81.                                 MessageBox(_T("444444444"),NULL,MB_OK);
  82.                                
  83.                                 break;
  84.                         }
  85.                        
  86.                 }       
  87.                 JXDlg jxdlg;
  88.                 while(1)//循环4
  89.                 {
  90.                        
  91.                         if(jxdlg.DoModal()==IDOK)
  92.                         {
  93.                                 SetTimer(1,m_iCycleTime*1000,NULL);
  94.                                 m_bRunFlag=TRUE;
  95.                                
  96.                                 break;
  97.                         }
  98.                        
  99.                         Sleep(6000);
  100.                        
  101.                 }
  102.         }
  103.        
复制代码

程序段如上,其中ptPA[0],ptPB[0],ptPC[0]为一片8255的三个端口,规定A写B、C读即控制字写入0x8B。
我的问题是读B、C口没问题,写A口是就出现了一会儿对,一会儿不对,且写A口的程序段放到不同的位置也是有时可读,有时不可读:
放在while循环中出现的情况:如前面,循环1中有时写正确,有时写失败,循环2、3、4就失败(循环1、2、3、4如程序标示)
放在while循环前面读写正确。


并且读写程序都是我以前的一个测试程序中用到的,也就是说读写代码段没有问题。
pa1=pa1|0x01;
*ptPA[0]=pa1;//这几句是我在原来的测试程序中用过的,是没有任何问题的。
delay(1000*1000);
麻烦达人们帮我分析一下,我找了好久没找到原因。

最新回复

在WinCE5.0中,驱动是在用户态的, 所以确实如楼主所说,可以在应用程序中访问硬件地址, 方法跟驱动中一样。   详情 回复 发表于 2008-11-28 10:52
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
应用程序可以直接操作硬件??
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
有没有用MmMapIoSpace将物理地址转化为虚拟地址?
在wince中是无法直接操作物理地址的,需要将其转化为虚拟地址.
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼主没有驱动的支持,怎么弄的?明显不行了。

你的程序不行的原因是你的驱动和应用没有配合好。
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

5
 
我没有做驱动程序,但是我原来的测试程序(应用程序)都是可以访问硬件的,也是用的同样的硬件访问
代码,并且是没有任何问题的.
正如我问题中说的,读数据没有问题,都是非常正确的,但写的时候就出问题了.我想可能是在代码中有
什么问题,不会是和驱动程序有关吧.
在我的程序中我只写了硬件访问的代码,地址影射部分在别的代码里面,我没有贴出来,显然也不是这个原因.
还有我认为驱动程序只不过是为硬件和软件开发人员建立了一个相互交流的平台,况且驱动程序也只不过是
一些DLL代码而已,所以通过驱动程序访问硬件只不过是比直接访问硬件多了一步而已,本质上没什么区别.

总之,非常感谢上面几位,但我认为不是上面的原因,还请麻烦各位认真分析一下上面的代码,有相关经验的人给予答复,谢谢!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
直接访问没问题的

是不是时间上有问题, 也就是时序有问题,建议看看示波器

抓正常的,和出错的 两组波形,对比下 呵呵
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

7
 
问题解决了,但还是解释不通,与大家分享,帮着解释一下.
在写之前加一个延时Sleep(300),就好了.
不知道为什么.
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 ninesuns02 的回复:
问题解决了,但还是解释不通,与大家分享,帮着解释一下.
在写之前加一个延时Sleep(300),就好了.
不知道为什么.

应用怎么写,要靠驱动提供支持,你没有提供驱动代码,没有办法分析。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

9
 
和硬件相关的问题,本来就不好回答,再加上你不提供具体的硬件平台,这样的问题,比猜谜都难!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
先用示波器。。。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

11
 
路过 问题比较深入
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 3 楼 gooogleman 的回复:
楼主没有驱动的支持,怎么弄的?明显不行了。

你的程序不行的原因是你的驱动和应用没有配合好。

说得有道理,有驱动,应用才能通过驱动来操作硬件
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

13
 
ptPA 之类的定义为 volatile 试试,可能你的变量被 CACHE 了。还有检测你地址 MMU 映射的是 CACHE 地址还是 NONE CACHE 地址。和硬件操作相关的内存变量都不能被 CACHE。否则值可能时对时不对。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

14
 
问题解决了,不过我感觉可能与时序有关,也可能是12楼兄弟说的,因为在循环后加上延时函数写数据就成功了.

  1. while(1)//循环1
  2.         {
  3.             
  4.             pb1=((*ptPB[0])&0x0FF)&0x07;// X000 &0111= 0000读出数据成功
  5.             delay(DELAY_TIME);
  6.             pa1=pa1|0x1;
  7.             if(pb1==0)//开关1 2 3按下;A灯亮
  8.             {
  9.               break;     
  10.             }
  11.         }
  12.         
  13.         JWdlg jwdlg;
  14.             
  15.         Sleep(300);
  16.             
  17.         *ptPA[0]=pa1;//这里写
  18.          delay(1000*1000);               
  19.          if(jwdlg.DoModal()==IDOK)
  20.          {        
  21.            ......
  22.          }
复制代码



不管怎么说,非常感谢你们.
不过,应用程序在进行地址映射后仍然可以访问物理地址,不一定非要写驱动程序.
我是个驱动初学者,书上说流接口驱动是运行在用户态的一些DLL,在看了部分代码
之后我发现其实在流接口驱动程序中访问物理地址也是通过映射来完成的,所以我自己
感觉通过驱动程序访问物理地址和直接在应用程序中访问物理地址是一样的.只要在应用程序中
做物理地址和虚拟地址的映射,同样也可以访问物理地址.
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

15
 
在WinCE5.0中,驱动是在用户态的,
所以确实如楼主所说,可以在应用程序中访问硬件地址,
方法跟驱动中一样。
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表