RT-Thread中实用的设备模型调试函数设备读和设备写
#ifdefined( RT_USING_FINSH ) && defined(RT_USING_DEVICE) && !defined(_WIN32)#include <finsh.h>
//设备写
//dev_name:设备名称
//hex: 指明buf是否为16进制,1是
//pos: 偏移
//buf: 要写的数据,以0结束
void dev_write(const char *dev_name,u8 hex,rt_off_t pos,char *buf)
{
rt_device_t dev = rt_device_find(dev_name);
if(dev)
{
int len = strlen(buf);
if(hex)
{
len = HexToBin(buf,len);
}//end if(hex)
len = rt_device_write(dev,pos,buf,len);
rt_kprintf("%d writed!\n",len);
}
else
{
rt_kprintf("%s can't find!\n",dev_name);
}
}
#define ONE_PER_LINE 8 //一行显示8个字符
void dev_read(const char *dev_name,rt_off_t pos,uint32_t len)
{
int i;
rt_device_t dev = rt_device_find(dev_name);
if(dev)
{
char buf={0};
int r;
int j;
if(len>128)
{
len=128;
}
r = rt_device_read(dev,pos,buf,len);
if(r<0)
{
rt_kprintf("read error:%d\n",r);
return;
}
rt_kprintf("readed:%d\n",r);
rt_kprintf("offset ");
for(i=0;i<ONE_PER_LINE;i++)
{
char a=i;
a = a<10?a+='0':a-10+'A';
rt_kprintf(" %c ",a);
}
rt_kprintf("\n");
j=0;
do
{
int k = j;
rt_kprintf("%8x ",pos);
len = r>ONE_PER_LINE?ONE_PER_LINE:r;
for(i=0;i<len;i++)
{
char a,b;
a = buf>>4;
a = a<10?a+='0':a-10+'A';
b = buf&0x0f;
b = b<10?b+='0':b-10+'A';
rt_kprintf("%c%c ",a,b);
j++;
}
i=8-len%8;
if(i<8)
{
while(i--)
{
rt_kprintf(" ");
}
}
for(i=0;i<len;i++)
{
if(isprint(buf))
{
rt_kprintf("%c",buf);
}
else
{
rt_kprintf(".");
}
k++;
}
rt_kprintf("\n");
pos+=ONE_PER_LINE;//show pos +
r-=ONE_PER_LINE;//len -
}while(r>0);
// rt_kprintf("\n");
}
else
{
rt_kprintf("%s can't find!\n",dev_name);
}
}
void dev_cont(const char *dev_name, rt_uint32_t cmd,rt_uint32_t r)
{
rt_device_t dev = rt_device_find(dev_name);
if(dev)
{
rt_kprintf("%d\n",dev->control(dev,cmd,&r) );
}
else
{
rt_kprintf("%s can't find!\n",dev_name);
}
}
FINSH_FUNCTION_EXPORT(dev_write,"Par:(const char *dev_name,u8 hex,rt_off_t pos,char *buf)")
FINSH_FUNCTION_EXPORT(dev_read,"Par:(const char *dev_name,rt_off_t pos,u8 len),len<=128")
FINSH_FUNCTION_EXPORT(dev_cont,"Par:(const char*dev_name, rt_uint32_t cmd,rt_uint32_t r") //把hex转化为bin
//返回转换后的长度
int HexToBin(char *buf,int len)
{
int i;
len = len/2;
for(i=0;i<len;i++)
{
u8 t = buf;
if(t>='a' && t<='z')
{
t=t-'a'+10;
}
else if(t>='A' && t<='Z')
{
t=t-'A'+10;
}
else if(t>='0' && t<='9')
{
t=t-'0';
}
else
{
t=0;
}
buf = t<<4;
t = buf;
if(t>='a' && t<='z')
{
t=t-'a'+10;
}
else if(t>='A' && t<='Z')
{
t=t-'A'+10;
}
else if(t>='0' && t<='9')
{
t=t-'0';
}
else
{
t=0;
}
buf |= t;
}
return len;
}
页:
[1]