|
本帖最后由 海之梦fly 于 2013-6-20 09:41 编辑
在LINUX的单个DS18B20下可以正常采集温度,但用两个DS18B20在单总线上时第二个没法采集温度
下面是APP:
13 #define K 0.0625
14
15 int main(void)
16 {
17 int fd = -1;
18 char count = 5;
19 unsigned int tmp = 0;float res=0;
20 fd = open("/dev/ds18b20", 0);
21 if(fd < 0)
22 {
23 perror("Can't open /dev/ds18b20 \n");
24 exit(1);
25 }
26 printf("open ds18b20 success \n");
27 while(1)
28 {
29 read(fd, &tmp , sizeof(tmp));
30 res=tmp*K;
31 printf("the currently temperature is %f\n",res);
33 sleep(2);
34 }
35 close(fd);
36 return 0;
37 }
驱动程序关键部分:
//在read 那里采集两个18B20
359 static char ch=0;^M
360 static ssize_t ds18b20_read(struct file *file, char __user *userbuf, size_t count, loff_t *off ) ^M
361 { ^M
362 int ret=0;
364 int tem=Ds18b20_GetTemperature(ch);//采集两个18B20
367 ch++;
368 if(ch==2)
369 ch=0;
373 ret=copy_to_user(userbuf, &tem, sizeof(tem));
}
245 int Ds18b20_GetTemperature(char numdevice)
246 {
247 char Tem_H=0,Tem_L=0;//16bit ,high byte,low byte
248 int data=0,i=0;
249 long id=0;
250 Ds18b20_Reset();
268 //Ds18b20_WriteByte(SKIP_ROM );//single ds
269 Match_DS18B20_ID(numdevice);
270 Ds18b20_WriteByte(CONVERT_T); //all DS convert to digital
271 udelay(2);
272 Ds18b20_Reset();
273 //Ds18b20_WriteByte(SKIP_ROM );
274 Match_DS18B20_ID(numdevice);
275 Ds18b20_WriteByte(READ_SCRATCHPAD);
276
277 Tem_L=Ds18b20_ReadByte();
278 Tem_H=Ds18b20_ReadByte();
279 data=(Tem_H<<8)|Tem_L;//16 bit byte
return data;
}
在无OS下程序是正常采集的,但在LINUX却不好使,不知哪里出问题了??
|
|