数组拷贝

qukuai_yin 2013-06-08 09:08:54
DWORD dwTotalLength = 0;
char CmdLog [1024*1024]={0};
while(TRUE)
{
dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512);
memcpy(CmdLog ,Recvbuffer,dwReadbytes);
}

怎么样将 总的Recvbuffer 拷贝到 CmdLog 中,Recvbuffer中末尾有[EOT](OK)找到了就break;
怎么写,求指导,最好贴上源码!
...全文
282 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qukuai_yin 2013-06-20
  • 打赏
  • 举报
回复
赵老师,不行啊,这个CmdLog只能记录一次PC段回复的数据,发完这个以后我还要发其他的命令到liunx板端,接受数据,把上次的覆盖掉了啊!
mujiok2003 2013-06-16
  • 打赏
  • 举报
回复
//memcpy(CmdLog ,Recvbuffer,dwReadbytes);
char mark[] = "[EOT](OK)";
char* p = std::search(Recvbuffer, Recvbuffer + dwReadbytes, mark, mark + sizeof(mark)-1);
if(p  < Recvbuffer + dwReadbytes) // found it
{
   std::copy(Recvbuffer, p,  CmdLog);//不含mark
  //std::copy(Recvbuffer, p + sizeof(mark) - 1,  CmdLog); //含mark
  break;
}
mujiok2003 2013-06-16
  • 打赏
  • 举报
回复
char CmdLog [1024*1024]={0};//1MB啦,小心栈溢出
赵4老师 2013-06-10
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
麻烦楼主把分给我这个真身啊! 略加优化:
const int LogLength=1024*1024;
DWORD dwTotalLength;
char CmdLog[LogLength];
char *s;
char *E="[EOT](OK)";
int i,j,L;

dwTotalLength=0;
s=CmdLog;
L=strlen(E);
j=0;
while (TRUE) {
   dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512);
   if (dwReadbytes>0) {
       if (dwTotalLength+dwReadbytes>LogLength) {
           printf("%s %d:%d==dwTotalLength+dwReadbytes>LogLength==%d!\n",__FILE__,__LINE__,dwTotalLength+dwReadbytes,LogLength);
           break;
       }
       memcpy(s,Recvbuffer,dwReadbytes);
       s+=dwReadbytes;
       dwTotalLength+=dwReadbytes
       for (i=j;i<dwTotalLength-L;i++) {
           if (0==memcmp(CmdLog+i,E,L)) break;
       }
       if (i<dwTotalLength-L) break;
       j=i;
   } else {
       printf("%s %d:%d==dwReadbytes<=0!\n",__FILE__,__LINE__,dwReadbytes);
       break;
   }
}
正解!信不信由帖主。
赵4老师 2013-06-09
  • 打赏
  • 举报
回复
 if (i<dwTotalLength-L)) break;
应改为
 if (i<dwTotalLength-L) break;
赵4老师 2013-06-09
  • 打赏
  • 举报
回复
5楼代码21-24行
        for (i=0;i<LogLength-L;i++) {
            if (0==memcmp(CmdLog+i,E,L)) break;
        }
        if (!(i<LogLength-L)) break;
应改为
        for (i=0;i<dwTotalLength-L;i++) {
            if (0==memcmp(CmdLog+i,E,L)) break;
        }
        if (i<dwTotalLength-L)) break;
赵4老师 2013-06-09
  • 打赏
  • 举报
回复
小心驶得万年船!
 const int LogLength=1024*1024;
 DWORD dwTotalLength;
 char CmdLog[LogLength];
 char *s;
 char *E="[EOT](OK)";
 int i,L;

 dwTotalLength=0;
 s=CmdLog;
 L=strlen(E);
 while (TRUE) {
    dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512);
    if (dwReadbytes>0) {
        if (dwTotalLength+dwReadbytes>LogLength) {
            printf("%s %d:%d==dwTotalLength+dwReadbytes>LogLength==%d!\n",__FILE__,__LINE__,dwTotalLength+dwReadbytes,LogLength);
            break;
        }
        memcpy(s,Recvbuffer,dwReadbytes);
        s+=dwReadbytes;
        dwTotalLength+=dwReadbytes
        for (i=0;i<LogLength-L;i++) {
            if (0==memcmp(CmdLog+i,E,L)) break;
        }
        if (!(i<LogLength-L)) break;
    } else {
        printf("%s %d:%d==dwReadbytes<=0!\n",__FILE__,__LINE__,dwReadbytes);
        break;
    }
 }
lm_whales 2013-06-09
  • 打赏
  • 举报
回复
引用 3 楼 ananluowei 的回复:
看代码的意思,首先读取512字节的内容,根据返回值dwreadbytes来判断写多少字节。 我不太清楚usb_bulk_read读取的时候到了结束符返回是什么。 我做过一个类似的文件拷贝的代码,如果返回值dwreadbutes小于512(读到了一个不完整的块),就认为是文件结束。 代码类似下面这样的

DWORD dwReadbytes = 512;//给一个初始值,让循环开始
while(dwReadbytes == 512)//不够512就认为读取结束。
{
    dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512);
    memcpy(CmdLog +S,Recvbuffer,dwReadbytes);
    S+=dwReadbytes ;
}
这个方法好,不然的话,就别怕麻烦,检查一下是否有,EOT[OK],EOT[ERROR]了
大尾巴猫 2013-06-09
  • 打赏
  • 举报
回复
看代码的意思,首先读取512字节的内容,根据返回值dwreadbytes来判断写多少字节。 我不太清楚usb_bulk_read读取的时候到了结束符返回是什么。 我做过一个类似的文件拷贝的代码,如果返回值dwreadbutes小于512(读到了一个不完整的块),就认为是文件结束。 代码类似下面这样的

DWORD dwReadbytes = 512;//给一个初始值,让循环开始
while(dwReadbytes == 512)//不够512就认为读取结束。
{
    dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512);
    memcpy(CmdLog +S,Recvbuffer,dwReadbytes);
    S+=dwReadbytes ;
}
qukuai_yin 2013-06-09
  • 打赏
  • 举报
回复
我这个是做PC端USB通讯用的,LIUNX根据约定发包过去,进行接收
我看你有戏 2013-06-09
  • 打赏
  • 举报
回复
字节扫描啊,找到位置赋值为0 指针就可以直接作为字符串来用了啊,保存好了,进行下一段字节的扫描,如此循环没数据了退出
赵4老师 2013-06-09
  • 打赏
  • 举报
回复
麻烦楼主把分给我这个真身啊! 略加优化:
const int LogLength=1024*1024;
DWORD dwTotalLength;
char CmdLog[LogLength];
char *s;
char *E="[EOT](OK)";
int i,j,L;

dwTotalLength=0;
s=CmdLog;
L=strlen(E);
j=0;
while (TRUE) {
   dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512);
   if (dwReadbytes>0) {
       if (dwTotalLength+dwReadbytes>LogLength) {
           printf("%s %d:%d==dwTotalLength+dwReadbytes>LogLength==%d!\n",__FILE__,__LINE__,dwTotalLength+dwReadbytes,LogLength);
           break;
       }
       memcpy(s,Recvbuffer,dwReadbytes);
       s+=dwReadbytes;
       dwTotalLength+=dwReadbytes
       for (i=j;i<dwTotalLength-L;i++) {
           if (0==memcmp(CmdLog+i,E,L)) break;
       }
       if (i<dwTotalLength-L) break;
       j=i;
   } else {
       printf("%s %d:%d==dwReadbytes<=0!\n",__FILE__,__LINE__,dwReadbytes);
       break;
   }
}
u011014573 2013-06-09
  • 打赏
  • 举报
回复
略加优化:
const int LogLength=1024*1024;
DWORD dwTotalLength;
char CmdLog[LogLength];
char *s;
char *E="[EOT](OK)";
int i,j,L;

dwTotalLength=0;
s=CmdLog;
L=strlen(E);
j=0;
while (TRUE) {
   dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512);
   if (dwReadbytes>0) {
       if (dwTotalLength+dwReadbytes>LogLength) {
           printf("%s %d:%d==dwTotalLength+dwReadbytes>LogLength==%d!\n",__FILE__,__LINE__,dwTotalLength+dwReadbytes,LogLength);
           break;
       }
       memcpy(s,Recvbuffer,dwReadbytes);
       s+=dwReadbytes;
       dwTotalLength+=dwReadbytes
       for (i=j;i<dwTotalLength-L;i++) {
           if (0==memcmp(CmdLog+i,E,L)) break;
       }
       if (i<dwTotalLength-L) break;
       j=i;
   } else {
       printf("%s %d:%d==dwReadbytes<=0!\n",__FILE__,__LINE__,dwReadbytes);
       break;
   }
}
u011014573 2013-06-09
  • 打赏
  • 举报
回复
等不及别人帮断帖,只好注册个马甲断了。
qukuai_yin 2013-06-08
  • 打赏
  • 举报
回复
while(TRUE) { dwReadbytes = pUsb->usb_bulk_read(hdev, EP_IN, (char *)Recvbuffer, 512); memcpy(CmdLog +S,Recvbuffer,dwReadbytes); S+=dwReadbytes ; } 现在一直在接受到对方的信息我这样子偏移不对! 怎么样动态将 总的Recvbuffer 拷贝到 CmdLog 中,度几个,拷贝到CmdLog 中Recvbuffer中末尾有[EOT](OK)​ [EOT](ERROR)为结束标志,跳出循环,该怎么写 怎么写,求指导,最好贴上源码!
图灵狗 2013-06-08
  • 打赏
  • 举报
回复
不懂要表达什么意思。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧