从串口收到n个数据包,按照协议的规定解包(自定义的协议),从中提取有用的数
据!包是行如(0x04,0x12,0x45......0x03)的串,我现在的想法是按协议一层一
层的判断(确定收到的包有没有问题,一层层的嵌套if),如果包可用,再到包中的
数据块用循环语句取出,要求算法有一定的纠错能力,如:每一个数据前都有年
月时间,如果其中有一个数据的年月时间和其他的不对,应改正过来!等等之类麻烦的是:解包的格式要根据包的内容动态的改变,可能连续的几个包都用这种
格式解,可能一种解包格式只用到当前收到的一个包......诸如此内的特别多,
我感觉一下想不过来,脑子不够用了!什么crc校验,异或校验,左移右移,进制
转换.......妈的,我头都快炸了!有什么好方法可以理清思路?
大家以前碰到这种问题是怎样处理的?最后问一句:解开后我想把得到的数据存储到n多CString变量里面(每一个数据放到一个变量中),然后写到对应的TXT文件中,并通过CListCtrl控件显示在界面上!应该行把?
种类 数据名 时间日期 号码
废气 NO 2002.12.19.15.19 13681134343
废水 断流时间 2002.12.19.15.20 13681156565
. . . .
. . . .
. . . .
. . . .
我没用过CListCtrl控件,哪有CListCtrl控件的实例!
也不一定非要用CListCtrl控件,DBGril控件也可以吧!那个方便用哪个,能提供一点信息吗?
希望大家能多给我提点建议!先谢过了!
据!包是行如(0x04,0x12,0x45......0x03)的串,我现在的想法是按协议一层一
层的判断(确定收到的包有没有问题,一层层的嵌套if),如果包可用,再到包中的
数据块用循环语句取出,要求算法有一定的纠错能力,如:每一个数据前都有年
月时间,如果其中有一个数据的年月时间和其他的不对,应改正过来!等等之类麻烦的是:解包的格式要根据包的内容动态的改变,可能连续的几个包都用这种
格式解,可能一种解包格式只用到当前收到的一个包......诸如此内的特别多,
我感觉一下想不过来,脑子不够用了!什么crc校验,异或校验,左移右移,进制
转换.......妈的,我头都快炸了!有什么好方法可以理清思路?
大家以前碰到这种问题是怎样处理的?最后问一句:解开后我想把得到的数据存储到n多CString变量里面(每一个数据放到一个变量中),然后写到对应的TXT文件中,并通过CListCtrl控件显示在界面上!应该行把?
种类 数据名 时间日期 号码
废气 NO 2002.12.19.15.19 13681134343
废水 断流时间 2002.12.19.15.20 13681156565
. . . .
. . . .
. . . .
. . . .
我没用过CListCtrl控件,哪有CListCtrl控件的实例!
也不一定非要用CListCtrl控件,DBGril控件也可以吧!那个方便用哪个,能提供一点信息吗?
希望大家能多给我提点建议!先谢过了!
解决方案 »
- 【奇怪了 Left Right GetLength 都不起作用】
- sdk中,如何使出来的窗口没有标题栏?WS_OVERLAPPEDWINDOW,WS_OVERLAPPED好像
- 界面中刷新的问题
- 有那位大虾,能给我讲讲EVENT?小弟不胜感激!!!!
- 最近在做listctrl,需要下面的功能,请问怎么实现?
- 请帮助,关于建立一个登陆窗口
- 关于timeSetEvent的问题,非常着急,希望高手们指点!!!!
- 工程的问题
- !!!!!急急急!!!!!!菜鸟问题,请问如何取得当前活动窗口句柄!!!!!!!!!!!
- 如何学习Window API编程!
- 请高手看一下,来者有分
- 用VB写的activex dll/exe/ocx/文档,是不是COM组件!!!100分有请。
CListCtrl m_list;
void CTestListDlg::OnOK()
{
//
m_list.InsertColumn (0,"Shape" ,LVCFMT_CENTER,80,-1);
m_list.InsertColumn (1,"X" ,LVCFMT_CENTER,80,-1);
m_list.InsertColumn (2,"Y" ,LVCFMT_CENTER,80,-1);
m_list.InsertItem(0,"0");
m_list.InsertItem(1,"1");
m_list.InsertItem(2,"2");
m_list.InsertItem(3,"3");}
//
建议使用Formula One 6,制作表格,非常灵活,只是打印预览不完善!
2、CListCtrl控件MSDN里面有例程,可以找来看看,只是显示很简单。
列表控件排序功能的实现
3、在对话框窗口中设计组合框(Group Box),组合框中设置四个无线按钮(Radio)“大图标|小图标|列表|资料”,同时设置排序、删除和关闭三个控制按钮(Button),并在对话框中设置大小合适的列表控制(List Ctrl),其对应标识分别如下:
--------------------------------------------------------------------------------控制名称 标题名称 标识符号
--------------------------------------------------------------------------------列表控制 IDC_LISTCTRL组合框 方式 IDC_STATIC无线按钮 大图标 IDC_STDICON小图标 IDC_SMLICON列 表 IDC_LIST资 料 IDC_REPORT按钮 排 序 IDC_SORT删 除 IDC_DEL关 闭 IDOK
--------------------------------------------------------------------------------4、在设置无线按钮时,需要注意的是只有大图标的Group属性为选中状态,而其它无线按钮的状态均为默认值。5、选中列表控制控件,选择“VIEW->ClassWizard->Memory Variables”,并利用IDC_ LISTCTRL引入成员变量,其变量类型为:变量名 种类 变量类型m_ListCtrl Control ClistCtrl同时利用“MESSAGES MAP”为各无线按钮和命令按钮增加控制功能。6、然后在包含文件和代码文件中分别加入如下代码:(1)在VCLISTDlg.h中增加数据结构和定义typedef struct tagSPS { //定义结构char szPm[10]; //品名int Lx; //0-GJ 1-XSchar szSl[10]; //数量char szDj[10]; //单价char szJe[10]; //金额} SPS;int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);(2)在VCLISTDlg.CPP中的起始处增加初始化数据和程序定义//在文件开始处增加数据结构初始化SPS Sps[]={//信息{"红梅",0,"1000","30","30000"},{"黄梅",0,"1000","29","29000"},{"绿梅",0,"1000","28","28000"},{"青梅",0,"1000","27","27000"},{"白梅",0,"1000","31","31000"},{"红梅",1,"1000","30","30000"},{"黄梅",1,"1000","29","29000"},{"绿梅",1,"1000","28","28000"},{"青梅",1,"1000","27","27000"},{"白梅",1,"1000","31","31000"}};CImageList Cil1,Cil2;//大小图像列表(3)在程序初始化处增加表头、图像和列表控制建立代码BOOL CVCLISTDlg::OnInitDialog(){CDialog::OnInitDialog();//......//其它代码// TODO: Add extra initialization here此处增加代码LV_ITEM lvitem;LV_COLUMN lvcol;int i,iPos,iItemNum;CVCLISTApp *pApp=(CVCLISTApp *)AfxGetApp();//创建图象列表Cil1.Create(32,32,TRUE,2,2);Cil1.Add(pApp->LoadIcon(IDI_GJ));Cil1.Add(pApp->LoadIcon(IDI_XS));Cil2.Create(16,16,TRUE,2,2);Cil2.Add(pApp->LoadIcon(IDI_GJ));Cil2.Add(pApp->LoadIcon(IDI_XS));//设置图象列表m_ListCtrl.SetImageList(&Cil1,LVSIL_NORMAL);m_ListCtrl.SetImageList(&Cil2,LVSIL_SMALL);//向列表控制中添加表列lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;lvcol.fmt=LVCFMT_CENTER;//居中i=0;lvcol.pszText="品 名";lvcol.iSubItem=i;lvcol.cx=70;m_ListCtrl.InsertColumn(i++,&lvcol);lvcol.pszText="数 量";lvcol.iSubItem=i;lvcol.cx=70;m_ListCtrl.InsertColumn(i++,&lvcol);lvcol.pszText="单 价";lvcol.iSubItem=i;lvcol.cx=70;m_ListCtrl.InsertColumn(i++,&lvcol);lvcol.pszText="金 额";lvcol.iSubItem=i;lvcol.cx=70;m_ListCtrl.InsertColumn(i++,&lvcol);//向列表控制中添加表项iItemNum=sizeof(Sps)/sizeof(SPS);for(i=0;i<iItemNum;i++){lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;lvitem.iItem=i;lvitem.iSubItem=0;lvitem.pszText=Sps[i].szPm;lvitem.iImage=Sps[i].Lx;lvitem.lParam=i;iPos=m_ListCtrl.InsertItem(&lvitem);//返回表项插入后的索引号lvitem.mask=LVIF_TEXT;lvitem.iItem=iPos;lvitem.iSubItem=1;lvitem.pszText=Sps[i].szSl;m_ListCtrl.SetItem(&lvitem);lvitem.iSubItem=2;lvitem.pszText=Sps[i].szDj;m_ListCtrl.SetItem(&lvitem);lvitem.iSubItem=3;lvitem.pszText=Sps[i].szJe;m_ListCtrl.SetItem(&lvitem);}CheckRadioButton(IDC_STDICON,IDC_REPORT,IDC_STDICON);return TRUE; // return TRUE unless you set the focus to a control}(4)完善列表显示方式代码在利用Classwizard类向导创建各功能按钮显示功能函数之后,必须依次完善这些功能函数的代码,这些功能函数如下:void CVCLISTDlg::OnStdicon()//设置大图标显示方式{ // TODO: Add your control notification handler code hereLONG lStyle;lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型lStyle&=~LVS_TYPEMASK; //清除显示方式位lStyle|=LVS_ICON; //设置显示方式SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型}void CVCLISTDlg::OnSmlicon() //设置小图标显示方式{ // TODO: Add your control notification handler code hereLONG lStyle;lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型lStyle&=~LVS_TYPEMASK; //清除显示方式位lStyle|=LVS_SMALLICON; //设置显示方式SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型}void CVCLISTDlg::OnList() //设置列表显示方式{ // TODO: Add your control notification handler code hereLONG lStyle;lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型lStyle&=~LVS_TYPEMASK; //清除显示方式位lStyle|=LVS_LIST; //设置显示方式SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型}void CVCLISTDlg::OnReport() //详细资料显示方式{ // TODO: Add your control notification handler code hereLONG lStyle;lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型lStyle&=~LVS_TYPEMASK; //清除显示方式位lStyle|=LVS_REPORT; //设置显示方式SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型}(5)删除功能的实现要实现删除功能,必须取得选中表项的数和表项总数,并且需要从后向前进行依次删除,其原因是每个表项被删除后,其后各表项的索引号均会发生递减变化,如果采取从前向后删除的方法,就会造成无法正常删除选中的表项,其功能代码如下:void CVCLISTDlg::OnDel() //删除按钮功能{ // TODO: Add your control notification handler code hereint i,iState;int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数int nItemCount=m_ListCtrl.GetItemCount();//表项总数if(nItemSelected<1) return;for(i=nItemCount-1;i>=0;i--){iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED);if(iState!=0) m_ListCtrl.DeleteItem(i);}}(6)排序功能的实现列表控制有一个特殊的功能,当以详细资料方式显示时,列表顶部的表头可以当作按钮来使用,这可以通过列表控制创建时的风格来控制。当鼠标点击列表头名称时,列表控制就会向其父窗口发送一个LNV_COLUMNCLICK消息,利用类导向中列表控制IDC_LISTCTRL对应的LNV_COLUMNCLICK消息加入相应处理函数,就可将表列按照特定顺序进行排列。其函数使用方法见程序,其中iSort为排序的表列索引号,(PFNLVCOMPARE)CompareFunc为进行具体排序的回调函数,也就是说,通过鼠标点击表头实现的排序过程是由第三方开发的专用排序函数来实现的,排序函数只是实现表项的具体比较操作,而整个排序过程是由SortItemS属性通过不断调用这个函数来实现的。正常的排序过程是升序方式,通过调换排序函数中的参数值,就可实现降序排列,即将PARAM1与PARAM2调换位置。这个回调函数的前两个参数为表列中表项的索引号,第三个参数为排序的表列索引号。void CVCLISTDlg::OnColumnclickListctrl(NMHDR* pNMHDR, LRESULT* pResult) { //鼠标左键单击表头处理函数NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;// TODO: Add your control notification handler code herestatic int iSorted=-1;//排列序号if (pNMListView->iSubItem==iSorted) return;iSorted=pNMListView->iSubItem;m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,iSorted);*pResult = 0;}//排序时比较表项的回调函数int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,LPARAM lParamSort){ char *text1,*text2;switch (lParamSort){case 0L:text1=Sps[lParam1].szPm;text2=Sps[lParam2].szPm;break;case 1L:text1=Sps[lParam1].szSl;text2=Sps[lParam2].szSl;break;