搜索
bottom↓
回复: 1

RT-Thread中实用的设备模型调试函数设备读和设备写

[复制链接]

出0入0汤圆

发表于 2011-12-2 22:09:47 | 显示全部楼层 |阅读模式
#if  defined( 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[129]={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[j]>>4;
                a = a<10?a+='0':a-10+'A';
                b = buf[j]&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[k]))
                {
                    rt_kprintf("%c",buf[k]);
                }
                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")

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 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[i*2];
                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[i*2+1];
                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;
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 08:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表