实际工控项目,串口数据先存到数据库,再显示。void CMainFrame::createList()
{
ctrlList.Create( WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS,
CRect(0,0,0,0), this, 1); //?? 不成功
ctrlList.SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT ); ctrlList.InsertColumn(0, L"开始时间", LVCFMT_CENTER, 120, 0 );
ctrlList.InsertColumn(1, L"结束时间", LVCFMT_CENTER, 120, 0 );
ctrlList.InsertColumn(2, L"管路号", LVCFMT_CENTER, 60, 0 );
ctrlList.InsertColumn(3, L"酒度", LVCFMT_CENTER, 60, 0 );
ctrlList.InsertColumn(4, L"设定值", LVCFMT_CENTER, 100, 0 );
ctrlList.InsertColumn(5, L"实际值", LVCFMT_CENTER, 100, 0 );
ctrlList.InsertColumn(6, L"实际体积", LVCFMT_CENTER, 100, 0 );
ctrlList.InsertColumn(7, L"开始温度", LVCFMT_CENTER, 60, 0 );
ctrlList.InsertColumn(8, L"结束温度", LVCFMT_CENTER, 60, 0 );
ctrlList.InsertColumn(9, L"产品名称", LVCFMT_CENTER, 120, 0 );
ctrlList.InsertColumn(10, L"产品批次", LVCFMT_CENTER, 120, 0 );
ctrlList.InsertColumn(11, L"R值", LVCFMT_CENTER, 100, 0 );
ctrlList.InsertColumn(12, L"脉冲总数", LVCFMT_CENTER, 120, 0 );

//配置数据源
SQLConfigDataSource( //?? 异常
                        NULL,
                        ODBC_ADD_DSN,
                        _T("Microsoft Access Driver (*.mdb)"),
                        _T("DSN=WS8DB\0DBQ=d:\\pj\\pj.mdb\0")
                        ); CDatabase data;
data.Open(_T("WS8DB"), //?? 异常
FALSE,
FALSE,
_T("DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;PWD=pj135246;UID=admin;")
); CRecordset ds( &data );
ds.Open( CRecordset::snapshot, L"SELECT * FROM 历史记录 ORDER BY 开始时间 DESC" ); //??
CDBVariant dbv;
for( int i = 0 ; !ds.IsEOF(); i++ )
{
CString str; ds.GetFieldValue(1, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%i-%02i-%02i %02i:%02i", dbv.m_pdate->year, dbv.m_pdate->month, dbv.m_pdate->day, dbv.m_pdate->hour, dbv.m_pdate->minute ); 
int n = ctrlList.InsertItem( i, str ); ds.GetFieldValue(2, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%i-%i-%i %i:%02i", dbv.m_pdate->year, dbv.m_pdate->month, dbv.m_pdate->day, dbv.m_pdate->hour, dbv.m_pdate->minute ); 
ctrlList.SetItemText( n, 1, str ); ds.GetFieldValue(3, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%i", dbv.m_lVal );
ctrlList.SetItemText( n, 2, str ); ds.GetFieldValue(4, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%0.1f", dbv.m_dblVal );
ctrlList.SetItemText( n, 3, str ); ds.GetFieldValue(5, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%0.1f", dbv.m_dblVal );
ctrlList.SetItemText( n, 4, str ); ds.GetFieldValue(6, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%0.1f", dbv.m_dblVal );
ctrlList.SetItemText( n, 5, str ); ds.GetFieldValue(7, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%0.1f", dbv.m_dblVal );
ctrlList.SetItemText( n, 6, str ); ds.GetFieldValue(8, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%0.1f", dbv.m_dblVal );
ctrlList.SetItemText( n, 7, str ); ds.GetFieldValue(9, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%0.1f", dbv.m_dblVal );
ctrlList.SetItemText( n, 8, str ); ds.GetFieldValue(10, dbv);
ctrlList.SetItemText( n, 9, dbv.m_dwType == DBVT_NULL ? L"" :  *dbv.m_pstringW ); ds.GetFieldValue(11, dbv);
ctrlList.SetItemText( n, 10, dbv.m_dwType == DBVT_NULL ? L"" :  *dbv.m_pstringW ); ds.GetFieldValue(12, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%0.4f", dbv.m_dblVal );
ctrlList.SetItemText( n, 11, str ); ds.GetFieldValue(13, dbv);
if( dbv.m_dwType == DBVT_NULL )
str = L"";
else
str.Format( L"%i", dbv.m_lVal );
ctrlList.SetItemText( n, 12, str ); ds.MoveNext();
}
ds.Close();
}

解决方案 »

  1.   

    若是我,不会使用中间数组而直接操作,在收到第1条时插入一条记录,如:m_List1.InsertItem(item,内容1); 并初始化列号 I
    再收到时,直接加入列中,如:m_List1.SetItemText(item,I,内容2); I增值直到完成此条记录。
      

  2.   

    若是我,不会使用中间数组而直接操作,在收到第1条时插入一条记录,如:m_List1.InsertItem(item,内容1); 并初始化列号 I
    再收到时,直接加入列中,如:m_List1.SetItemText(item,I,内容2); I增值直到完成此条记录。
    我用中间数组是为了截取数据中一段有用数据,直接插入一条记录,关键的地方就是这个内容1,内容2怎么是我想要的内容呢。现在很奇怪的是,如果收到的数据串很短,经过判断后能得到正确 的回复,如果收到的数据串很长,中间会有一部分数据丢失。
      

  3.   

    void CScanChannelDlg::OnComm() 
    {
    // TODO: Add your control notification handler code here
     //   Sleep(1000);
    VARIANT variant_inp;  
    COleSafeArray safearray_inp;  
    LONG len,k;  
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.  
    CString strtemp;  
    CString strchange1;
    CString strchange2;
        char change[2048];
    if(m_mscomm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符  
    { ////////以下你可以根据自己的通信协议加入处理代码  
    variant_inp=m_mscomm1.GetInput(); //读缓冲区  
    safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量  
    len=safearray_inp.GetOneDimSize(); //得到有效数据长度  
    for(k=0;k<len;k++)  
    safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组  
    for(k=0;k<len;k++) //将数组转换为Cstring型变量  
    {  
    BYTE bt=*(char*)(rxdata+k); //字符型  
    strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放  
    // MessageBox(strtemp,"strtemp");
    strchange1+=strtemp;
    }  
    strncpy(change,(LPCTSTR)strchange1,sizeof(change));
    int i,j;
    // for(k=0;k<len;k++)
    // {
    // strchange2.Format("%c",change[k]);
    // m_editreceive+=strchange2;
    // }

        for(i=0;i<(len-1);i++)
    {
    if(change[i]=='O' && change[i+1]=='p')
    {
    for(j=i;j<(len-1);j++)
    {

    if((change[j]=='-' && change[j+1]=='-')||(change[j]=='O' && change[j+1]=='K'))
            {
    break;
    }
                                             m_editreceive+=change[j];
    }
    }
    }
    }
    UpdateData(FALSE);
    }
      

  4.   

    我不用串行通信组件,所以通信中也不会丢包,给一个Unicode转换函数,直接完成缓冲区转换,供参考:// ANSI To UNCODE转换
    CString CStringProc::AnsiToUnicode(char * szAnsi, int len)
    {
    CString str;
    // ansi to unicode
    //预转换,得到所需空间的大小
    int wcsLen;
    if(len>0)
    wcsLen=len;
    else
    wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
    //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
    wchar_t* wszString = new wchar_t[wcsLen + 1];
    //转换
    ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
    //最后加上'\0'
    wszString[wcsLen] = '\0'; // UNICODE字串
    str=wszString;
    delete wszString;
    return str;
    }
      

  5.   

    结贴,问题解决了,方法没有错,在这里strncpy(change,(LPCTSTR)strchange1,sizeof(change));加个延迟就好了。感谢hhhh63和笨笨仔的热心回复。