1 在類的頭文件中定義串口控件數組
CMSComm* m_ctrlComm[50];編程
2 編寫ID值
3 手動添加事件,不要利用ClassWizard
1 在頭文件中
- // Generated message map functions
- //{{AFX_MSG(CSellWatchDlg)
- afx_msg void OnOnCommMscomm1(UINT nID);
- virtual BOOL OnInitDialog();
- DECLARE_EVENTSINK_MAP()
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
2在cpp文件中
- BEGIN_EVENTSINK_MAP(CSellWatchDlg, CDialog)
- //{{AFX_EVENTSINK_MAP(CSellWatchDlg)
-
- //ON_EVENT(CSellWatchDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
- //}}AFX_EVENTSINK_MAP
- ON_EVENT_RANGE(CSellWatchDlg, IDC_MSCOMM,IDC_MSCOMM+49, 1 /* OnComm */, OnOnCommMscomm1, VTS_I4 )
4 在OnInitDialog()初始化控件數組
for(int i=0; i<50; i++)
{
m_ctrlComm[i] = new CMSComm();
if(!m_ctrlComm[i]->Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM+i))
{
AfxMessageBox("建立MSComm失敗");
}數組
}ide
5 打開串口
- CString strPortNo;
-
- // 保存ini各項值數組
- char szOption1[MAX_PATH];
- char szOption2[MAX_PATH];
- char szOption3[MAX_PATH];
- char szOption4[MAX_PATH];
- char szOption5[MAX_PATH];
-
- CString str;
-
- CString strNum;
-
- g_strCommOpening = "已打開串口號";
-
-
- int n = GetCommNum();
-
- int i =1,j=0;
-
- if(n > 0)
- {
-
- while( n > 0)
- {
- str = "COM";
-
- strPortNo.Format("%d",i);
-
- str= str+strPortNo;
-
- char * p = str.GetBuffer(str.GetLength()+1);
-
- Cini::ReadString(p , "串口號", szOption1, "COMM.ini");//端口號
-
- if(szOption1[0] == '\0')
- {
- i++;
-
- continue;
- }
-
- i++;
-
- p = str.GetBuffer(str.GetLength()+1);
-
- Cini::ReadString(p , "波特率", szOption2, "COMM.ini");//波特率
- Cini::ReadString(p , "檢驗位", szOption3, "COMM.ini");//校驗位
- Cini::ReadString(p , "數據位", szOption4, "COMM.ini");//數據位
- Cini::ReadString(p , "中止位", szOption5, "COMM.ini");//中止位
-
- m_strPortNo.Format("%s",szOption1); //端口號
- m_strBaud.Format("%s",szOption2);//波特率
- m_strParity.Format("%s",szOption3);//校驗位
- m_strDatabits.Format("%s",szOption4);//數據位
- m_strStopbits.Format("%s",szOption5);//中止位
-
- UpdateData(FALSE);
-
- //打開串口
-
- int nport,nRate,nData,nStop;
-
- char cCheck;
-
- CString str_setting;
-
- if(m_strParity == "無")
- cCheck = 'n'; // 校驗位爲無
- else if ( m_strParity == "奇校驗")
- cCheck = 'o'; //校驗位爲奇校驗
- else
- cCheck = 'e'; // 校驗位爲偶校驗
-
- g_strPortNo = m_strPortNo;
-
- nport = atoi(m_strPortNo);//端口號
-
- nRate = atoi(m_strBaud);//波特率
-
- //nCheck = atoi(strCheck);//校驗位
-
- nData = atoi (m_strDatabits);//數據位
-
- nStop = atoi(m_strStopbits);//中止位
-
- str_setting.Format(_T("%d, %c, %d, %d"), nRate, cCheck, nData, nStop);
-
- m_ctrlComm[j]->SetCommPort(nport);//選擇COM[nPort]
-
- m_ctrlComm[j]->SetInputMode(1);//表示以二進制方式取回數據
-
- m_ctrlComm[j]->SetInBufferSize(2000);//設置接收緩衝區大小
-
- m_ctrlComm[j]->SetOutBufferSize(512);//設置發送緩衝區的大小
-
- m_ctrlComm[j]->SetSettings(str_setting);
-
- if(!m_ctrlComm[j]->GetPortOpen())
- {
-
- m_ctrlComm[j]->SetPortOpen(TRUE);
- }
-
- if(m_ctrlComm[j]->GetPortOpen())
- {
- m_ctrlComm[j]->SetRThreshold(1);//每接收1個字節就產生一個OnComm 事件
-
- m_ctrlComm[j]->SetInputLen(0);//表示一次讀取所有數據
-
- g_strCommOpening = g_strCommOpening+m_strPortNo+",";
- }
-
- j++;
-
- n--;
-
- }
-
- }
-
- else
- {
- AfxMessageBox("請先設置串口");
-
- CSerialPortDlg dlg;
-
- dlg.DoModal();
-
- }
6 編寫OnOnCommMscomm1(UINT nID)事件
- VARIANT variant_inp;
-
- COleSafeArray safearray_inp;
-
- BOOL b = FALSE;
-
- LONG len=0;
-
- LONG k=0;
-
- //m_strReceive = _T("");
-
- BYTE rxdata[2048];
-
- CString strtemp = _T("");
-
- int i =nID - 900;
-
- m_strReceive[i] = _T("");
-
- if(m_ctrlComm[i] != NULL)
- {
-
- if(m_ctrlComm[i]->GetCommEvent() == 2) //若是接收緩衝區內有字符
- {
- Sleep(1000);
-
- variant_inp = m_ctrlComm[i]->GetInput();//讀緩衝區
-
- safearray_inp = variant_inp;
-
- len=safearray_inp.GetOneDimSize(); //獲得有效數據長度
-
- for( k=0; k<len; k++ )
- {
- safearray_inp.GetElement(&k,rxdata+k);//轉換爲BYTE型數組
-
- BYTE bt=*(char*)(rxdata+k);//字符型
-
- strtemp.Format("%c",bt);
-
- m_strReceive[i]+=strtemp;//加入接受編輯框對應字符
- }
-
- SYSTEMTIME sys;
-
- GetLocalTime(&sys);//接收數據的日期及時間
-
- int day = sys.wDay;
-
- int month =sys.wMonth;
-
- int year = sys.wYear;
-
- int hour = sys.wHour;
-
- int minute = sys.wMinute;
-
- int second = sys.wSecond;
-
- CString strDateStart,strTimeStart;
-
- strDateStart.Format("%d-%d-%d",year,month,day);
-
- strTimeStart.Format("%d:%d:%d",hour,minute,second);
-
- m_strReceive[i] += strDateStart+"|"+strTimeStart+"|";
-
- char *p10 = strTimeStart.GetBuffer(strTimeStart.GetLength()+1);
-
- char *p0 = m_strReceive[i].GetBuffer(m_strReceive[i].GetLength()+1);
-
- Cini::WriteString(p10, "商品詳細信息", p0, "Log.ini");
-
- //MessageBox(m_strReceive[i],"商品信息");
-
- b = SplitInformation(m_strReceive[i]);
-
- if(!b)//檢測分割的數據
- {
- MessageBox("商品信息傳輸錯誤");
-
- return ;
- }
-
- ShowString(m_strInfor);//疊加商品信息
-
- VideoView();//銷售預覽
-
- SendToTable(m_strReceive[i]);//存入數據庫
-
- m_ctrlComm[i]->SetInBufferCount(0);
-
- UpdateData(FALSE);
-
- }
- }
- else
- {
- MessageBox("動態內存分配失敗","警告",MB_ICONEXCLAMATION);
- }