rocking2807
驱动牛犊
驱动牛犊
  • 注册日期2006-11-20
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望88点
  • 贡献值0点
  • 好评度83点
  • 原创分0分
  • 专家分0分
阅读:1248回复:4

流接口驱动通信的问题

楼主#
更多 发布于:2007-04-05 08:39
  有个问题请教各位大哥
我的CAN驱动程序通信时会丢数
我用的查询方式,CPU是2410,CAN控制器是2510,
在驱动中我在CAN_OPEN中从串口打出收到的数,一个不丢,代码如下
DWORD CAN_Open( DWORD dwData,
                DWORD dwAccess,
                DWORD dwShareMode)
{
    switch(dwShareMode) {
        case 0:
            Init_MCP2510(BandRate_10kbps); break;
        case 1:
            Init_MCP2510(BandRate_100kbps); break;
        case 2:
            Init_MCP2510(BandRate_125kbps); break;
        case 3:
            Init_MCP2510(BandRate_250kbps); break;
        case 4:
            Init_MCP2510(BandRate_500kbps); break;
        case 5:
            Init_MCP2510(BandRate_1Mbps); break;
        case 6:
            Init_MCP2510(BandRate_833kbps); break;
        default:
                        break;
    }
    Can_Setup();
//RETAILMSG(1,(TEXT( "open"));
/*int i;
U32 id;
unsigned char dlc;
int rxRTR, isExt;
int temp;
U8 data_read[32];
int j=0;
while(1)
{
    i = Can_Poll();        
    if((i==0)|(i==1))
    {    
        memset(data_read,0,sizeof(data_read) ) ;
        temp = Can_Read(i, &id, data_read, &dlc, &rxRTR, &isExt);
        out_buff[0] = ((id>>24)&0xff);  
        out_buff[1] = ((id>>16)&0xff);                    
        out_buff[2] = ((id>>8)&0xff);
        out_buff[3] = ((id)&0xff);
    RETAILMSG(1,(TEXT( " read out %x--no=%d\n"), data_read[0],j++ ) );
    }
}
*/

    return 1;
}
红色部分为加入调试代码,也就是串口反数部分.这时数据一个不丢.
但是当我把这段代码放入到正式的CAN_READ中,就会丢数.如下:
DWORD CAN_Read(DWORD hOpenContext,LPVOID pBuffer ,DWORD count)
{
    int i;
    U32 id;
    unsigned char dlc;
    int rxRTR, isExt;
    int temp;
    U8 data_read[32];
    if(count==9)
    {
        memcpy(CanID,pBuffer,4);
        count=8;
Read:
        i = Can_Poll();
        
        if((i==0)|(i==1))
        {
            memset(data_read,0,sizeof(data_read) ) ;
            temp = Can_Read(i, &id, data_read, &dlc, &rxRTR, &isExt);
            out_buff[0] = ((id>>24)&0xff);  
            out_buff[1] = ((id>>16)&0xff);                    
            out_buff[2] = ((id>>8)&0xff);
            out_buff[3] = ((id)&0xff);
            if((out_buff[2]!=CanID[2]) || (out_buff[3]!=CanID[3]))
            {    
                goto Read;
            }else
            {            
                memcpy(pBuffer,data_read,count);
            }
        }
        else
        {
            return 0;
              }
    }else if(count!=9)
    {
        i = Can_Poll();
        
        if((i==0)|(i==1))
        {
            memset(data_read,0,sizeof(data_read) ) ;
            temp = Can_Read(i, &id, data_read, &dlc, &rxRTR, &isExt);
            memcpy(pBuffer,data_read,count);
            out_buff[0] = ((id>>24)&0xff);  
            out_buff[1] = ((id>>16)&0xff);
            out_buff[2] = ((id>>8)&0xff);
            out_buff[3] = ((id)&0xff);  
        }
        else
        {
            return 0;
              }
    }
    return count ;
}
因为是查询方式,我认为是上层应用程序读数太慢造成的,但是修改后的上层程序速度很快,经串口打数发现,每调用5次才有一次读到数,也就是很快了,又觉得是驱动里丢数,想来想去,想不明白,问了很多人了.都不很清楚.

最新喜欢:

wingmanwingma...
wenzai
驱动中牛
驱动中牛
  • 注册日期2002-04-16
  • 最后登录2011-03-04
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望424点
  • 贡献值0点
  • 好评度309点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-05 10:52
i = Can_Poll();
      
       if((i==0)|(i==1))
我认为你必须等待i有效后再去读数据
就像你红色代码中的。
rocking2807
驱动牛犊
驱动牛犊
  • 注册日期2006-11-20
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望88点
  • 贡献值0点
  • 好评度83点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-05 12:04
我这两部分不是一样的么,有什么不同么,我基本上是复制过去的啊
 i = Can_Poll();
      
       if((i==0)|(i==1))
这段代码都有的啊
rocking2807
驱动牛犊
驱动牛犊
  • 注册日期2006-11-20
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望88点
  • 贡献值0点
  • 好评度83点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-05 16:54
各位给我看看啊,
rocking2807
驱动牛犊
驱动牛犊
  • 注册日期2006-11-20
  • 最后登录2010-09-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望88点
  • 贡献值0点
  • 好评度83点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-06 14:20
顶上去
游客

返回顶部