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);
- }