阅读:1248回复:4
流接口驱动通信的问题
有个问题请教各位大哥
我的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次才有一次读到数,也就是很快了,又觉得是驱动里丢数,想来想去,想不明白,问了很多人了.都不很清楚. |
|
最新喜欢:wingma... |
沙发#
发布于:2007-04-05 10:52
i = Can_Poll();
if((i==0)|(i==1)) 我认为你必须等待i有效后再去读数据 就像你红色代码中的。 |
|
板凳#
发布于:2007-04-05 12:04
我这两部分不是一样的么,有什么不同么,我基本上是复制过去的啊
i = Can_Poll(); if((i==0)|(i==1)) 这段代码都有的啊 |
|
地板#
发布于:2007-04-05 16:54
各位给我看看啊,
|
|
地下室#
发布于:2007-04-06 14:20
顶上去
|
|