lixun00 发表于 2011-12-2 22:09:47

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")

lixun00 发表于 2011-12-2 22:11:16

//把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]
查看完整版本: RT-Thread中实用的设备模型调试函数设备读和设备写