| 发表于:2007-02-05 14:39:20 楼主 |
void __fastcall tfrmmain::sbdowngoodsclick(tobject *sender) { int ncount = 0; unsigned char pszbuffer[65536]; unsigned char pszresult[128]; int nfieldlength[16]; ansistring strdata; if(0 == m_nportopen) { m_hporthandle = shtp_openport(cbport.itemindex+1,b115200); if(null == m_hporthandle) { messagebox(null, "无法打开此串口 ", "错误提示 ",mb_ok ¦mb_iconstop); return; } shtp_settimeout(m_hporthandle,100); m_nportopen = 1; } //首先提取list中的数据长度 int ngoodsamount = lvlist.items.count; if(0 == ngoodsamount) { messagebox(null, "没有数据可以下载 ", "错误提示 ",mb_ok ¦mb_iconstop); if(m_nportopen)shtp_closeport(m_hporthandle); m_hporthandle = null; m_nportopen = 0; return; } tinifile *pinifile; ansistring strfilename = editfile.text; ansistring strlistfile = changefileext( strfilename, ".dlf " ); pinifile = new tinifile( changefileext( strfilename, ".ini " ) ); //提取有多少字段 int nsector = pinifile.readinteger( "goods ", "amount ", 1 ); for(int i=0;i <nsector;i++) { char psztest[16]; sprintf(psztest, "%d ",i); nfieldlength[i] = pinifile.readinteger( "length ", psztest, 10 ); } //提取条码索引字段 int nindex = pinifile.readinteger( "goods ", "index ", 0 ); //提取需要显示的字段 strdata = pinifile.readstring( "goods ", "pos ", "0 " ); int nindexpos = strdata.pos(inttostr(nindex)); if(nindexpos)nindexpos--; char pszfieldlist[16]; strcpy(pszfieldlist,strdata.c_str()); int ndownfieldlist = strlen(pszfieldlist); delete pinifile; sbstate.simpletext = "正在处理数据... "; //准备数据,准备下载 //首先要对数据按照要查找的索引进行排序 //读取文件进行下载,一次要读去所有的内容 char* pszdownloadlist; //提取文件长度 file* fp; fp = fopen(strlistfile.c_str(), "r "); long curpos, length; curpos = ftell(fp); fseek(fp, 0l, seek_end); length = ftell(fp); fseek(fp, curpos, seek_set); pszdownloadlist = (char*)malloc(length*sizeof(char)); curpos = 0; char psztemplist[256]; memset(psztemplist,0x00,256); strcpy(pszdownloadlist, " "); ncount = 0; int nrecordlength; while(fgets(psztemplist,256,fp)) { nrecordlength = strlen(psztemplist); curpos += nrecordlength; psztemplist[nrecordlength-1] = 0x00; strcat(pszdownloadlist,psztemplist); memset(psztemplist,0x00,256); ncount++; //if(0 == ncount%100) { sbstate.simpletext = "正在处理数据... " + inttostr(ncount); msg msg; while(::peekmessage(&msg,null,0,0,pm_remove))dispatchmessage(&msg); } } ngoodsamount = ncount; length = strlen(pszdownloadlist); fclose(fp); //发送物品库需要提供数目,长度等,备注:只下载显示字段 //命令头格式:单次下载的长度(2)+记录数(3)+标志字节(1)+记录长度(1)+字段长度(1)... //备注:单次下载的长度为1024/2048/4096字节,记录数 商品库的数目 //标志字节的高半个字节表示按照那个索引来查找条码 原则上下载的第一个字段是条码 //低半个字节表示字段数目,记录数x记录长度是本次下载的所有商品库的字节 //记录长度=所有字段的长度之和 sbstate.simpletext = "准备发送物品库 "; //单次下载的长度 pszbuffer[0] = ssi_unit_send_length/256; pszbuffer[1] = ssi_unit_send_length%256; //商品数目 pszbuffer[2] = ngoodsamount/(256*256); pszbuffer[3] = ngoodsamount/256; pszbuffer[4] = ngoodsamount%256; //标志字节 pszbuffer[5] = nindexpos < <4; pszbuffer[5] += ndownfieldlist; //添加具体字段的长度 int ndownloadlength = 0; for(int i=0;i <ndownfieldlist;i++) { pszbuffer[7+i] = nfieldlength[pszfieldlist[i]-0x30]; ndownloadlength += nfieldlength[pszfieldlist[i]-0x30]; } //字长度 pszbuffer[6] = ndownloadlength; int ndownflag = 1; for(ncount=0;ncount <6;ncount++) { shtp_purgeport(m_hporthandle,2); shtp_putmessage(m_hporthandle,ssi_good_list,pszbuffer,7+ndownfieldlist); //等待接收下位机应答 if(shtp_succ == shtp_getmessage(m_hporthandle,pszresult,30)) { sbstate.simpletext = "正在发送物品库 "; ndownflag = 0; break; } } if(ndownflag) { sbstate.simpletext = "没有接收到下位机应答... "; if(m_nportopen)shtp_closeport(m_hporthandle); m_hporthandle = null; m_nportopen = 0; free(pszdownloadlist); return; } //开始连续发送数据 dword dwlength; int noffset; sbstate.simpletext = "开始发送商品信息数据... "; int ndown64kstep,ndownunitstep; ndown64kstep = length/65536; sleep(5); for(ncount=0;ncount <ndown64kstep;ncount++) {//开始下载64k数据 for(int i=0;i <64;i++) { noffset = ncount*65536 + i*ssi_unit_send_length; shtp_purgeport(m_hporthandle,2); writefile(m_hporthandle,pszdownloadlist+noffset,ssi_unit_send_length,&dwlength,null); //需要确认一下才能发下一部分数据 if(shtp_succ == shtp_getmessage(m_hporthandle,pszresult,300)) { sbstate.simpletext = inttostr(noffset/ndownloadlength+1); msg msg; while(::peekmessage(&msg,null,0,0,pm_remove))dispatchmessage(&msg); } else {//没有接收到应答 sbstate.simpletext = "发送失败... "; if(m_nportopen)shtp_closeport(m_hporthandle); m_hporthandle = null; m_nportopen = 0; free(pszdownloadlist); return; } } } //发送完所有数据 sbstate.simpletext = "发送成功... "; if(m_nportopen)shtp_closeport(m_hporthandle); m_hporthandle = null; m_nportopen = 0; free(pszdownloadlist); return; } |
|
|
|
|