转载:http://blog.sina.com.cn/s/blog_53a182df0102vs0o.html
最近使用com通讯,于是试验了CMSComm类的使用方法,进行总结
1、在项目中插入MSComm控件,选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
这时在ClassView视窗中就可以看到CMSComm类了,并且在控件工具栏Controls中出现了电话图标,用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
2、串口如何打开与关闭
void CTestVCcomDlg::OnButtonSerialopenclose()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
if(m_ctrlCommA.GetPortOpen())
{
m_ctrlCommA.SetPortOpen(FALSE);
SetDlgItemText(IDC_BUTTON_SERIALOPENCLOSE,"serialcom open");
}
else
{
CString Baudrate;
Baudrate="115200,n,8,1";
m_ctrlCommA.SetCommPort(m_ComANum);//设置端口号
m_ctrlCommA.SetInBufferSize(10240);//设置接收缓冲区大小,若不能及时读取串口数据,则串口接收到的数据在缓冲区中越积越多,超过10240就会造成丢数,因此设置这个数字时,要考虑到多久读一次串口,是否可能发生缓冲区溢出的情况。
m_ctrlCommA.SetOutBufferSize(1024);//设置发送缓冲区大小,若发送速度太快,旧的数据还未发出去,新的要发送的数据就来了,导致串口发送缓冲区沾满就会丢数。因此设置这个数字时,要考虑多久发送一次数据,发送间隔是否过小,是否造成发送缓冲区溢出。
m_ctrlCommA.SetInputLen(0); //设置当前接收区数据长度为0,表示全部读取
m_ctrlCommA.SetInputMode(1);//以二进制方式读写数据
m_ctrlCommA.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlCommA.SetSettings(Baudrate);//设置波特率、校验位
m_ctrlCommA.SetPortOpen(TRUE);//打开串口
m_ctrlCommA.GetInput();//清空串口数据
if( !m_ctrlCommA.GetPortOpen())
{
AfxMessageBox("cannot open serial port A");
return;
}
SetDlgItemText(IDC_BUTTON_SERIALOPENCLOSE,"serialcom close");
}
}
3、发送数据
由于以十六进制发送可以发送任意内容,因此此处以发送十六进制数为例
CByteArray Hexdata;//要发送的信息保存于Hexdata中
Hexdata.SetSize(6);//设置发送字节数
Hexdata[0] = 0xAB;//分别赋值
Hexdata[1] = 0xCD;
Hexdata[2] = 0xEF;
Hexdata[3] = 0x01;
Hexdata[4] = 0x23;
Hexdata[5] = 0x45;
m_ctrlCommA.SetOutput(COleVariant(Hexdata));
4、接收数据
void CTestVCcomDlg::OnOnCommMscommA()
{
VARIANT cominput;
COleSafeArray m_input;
long length,i,j;
char combyte;
if(m_ctrlCommA.GetCommEvent()==2)//接收缓冲区内有字符
{
cominput=m_ctrlCommA.GetInput();//读取缓冲区内的数据
m_input=(cominput);//将VARIANT型变量转换为ColeSafeArray型变量
length=m_input.GetOneDimSize();//确定数据长度
FILE *fp;
fp =fopen("comAlog.txt","a");
for(i=0;i < length; i++)
{
m_input.GetElement(&i,&combyte);
fwrite(&combyte,1,1,fp);
}
fclose(fp);
}
}
上述就完成了串口的接收与发送。所有串口的开发都离不开上述代码。