1.准别工作
高版本的VS没有MSComm通讯控件,需要自己下载http://download.csdn.net/detail/axiqia/9466667。
解压后拷贝到:
C:\Windows\System32(WIN7系统);
C:\WINDOWS\system32(XP系统)。
注意:64位win7系统还需要将mscomm32.ocx文件复制到C:\Windows\SysWOW64\目录下,否则后面注册会出错。
在C:\Windows\System32里找到cmd.exe以管理员身份运行:
Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX
修改注册表:
win+R组合键打开“运行”或者直接在开始菜单里找到“运行”;输入regedit后回车,打开注册表管理器,在其中找到HKEY_CLASSES_ROOT项下的Licenses项,添加主项命名为“4250E830-6AC2-11cf-8ADB-00AA00C00905”,并将键值修改为“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”
2.进入正题
一、打开VS2010软件,绘制界面;
我们可以看到就绪之后的界面如下图所示,按照步骤把原来的静态文本框和确定按钮、取消按钮删掉;
二、为我们的对话框添加控件
在这一步一定要小心选择右边的属性;
二、添加控件和变量
三、为按钮和串口控件添加程序函数
void C串口v2Dlg::OnBnClickedButtonOpen()
{
CString str, str1, n;
GetDlgItemText(IDC_BUTTON_OPEN, str); //str获得与对话框中的控件相关的标题或文本
CWnd *h1; //窗口类的基类
h1 = GetDlgItem(IDC_BUTTON_OPEN); //指向控件的caption
//串口为关闭状态
if(!m_mscom.get_PortOpen())
{
m_comb2.GetLBText(m_comb2.GetCurSel(), str1); //取得所选的字符串,并存放在str1里面
str1 = str1+','+'n'+','+'8'+','+'1';
m_mscom.put_CommPort(m_comb1.GetCurSel()+1); //选择串口
m_mscom.put_InputMode(1); //设置输入方式为二进制方式
m_mscom.put_Settings(str1); //comb2选择的波特率,无校验,8数据位,1个停止位
m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024
m_mscom.put_RThreshold(1); //缓冲区一个字符引发事件
m_mscom.put_RTSEnable(1); //设置RT允许
m_mscom.put_PortOpen(true); //打开串口
//打开成功
if(m_mscom.get_PortOpen())
{
str = _T("关闭串口");
UpdateData(true); //把控件中的值和变量进行交换
h1->SetWindowText(str); //改变按钮名称为‘’关闭串口”,提供关闭操作
}
}
//串口为打开状态
else
{
m_mscom.put_PortOpen(false); //关闭串口
//关闭成功
if(str != _T("打开串口"))
{
str = _T("打开串口");
UpdateData(true);
h1->SetWindowText(str); //更新数据后,提供打开操作
}
}
}
void C串口v2Dlg::OnBnClickedButtonSend()
{
UpdateData(true); //更新控件数据
m_mscom.put_Output(COleVariant(m_EditSend));//把发送编辑框的数据发送出去
}
void C串口v2Dlg::OnBnClickedButtonClean()
{
m_EditReceive = _T(""); //给接收编辑框发送空格符
UpdateData(false); //根据数据状态反馈给控件
}
void C串口v2Dlg::OnBnClickedButtonClose()
{
//若当前串口为打开
if(m_mscom.get_PortOpen())
m_mscom.put_PortOpen(false); //置为关闭
CDialogEx::OnCancel();
}
void C串口v2Dlg::OnCommMscomm1()
{
//接收缓冲区有数据
if(m_mscom.get_CommEvent() == 2)
{
char str[1024] = {0}; //缓冲区最大为1024
long k;
VARIANT InputData = m_mscom.get_Input(); //读入缓冲区
COleSafeArray fs;
fs = InputData; //VARIANT型变À量转换为COleSafeArray型变量
for(k = 0; k < fs.GetOneDimSize(); k++)
{
fs.GetElement(&k, str+k); //转换为BYTE型数组
}
m_EditReceive += str; //接收到编辑框里面
//SetTimer(1, 10, NULL); //延时10ms
UpdateData(false); //将数据在屏幕中对应控件中显示出来。
}
}
在对话框初始部分BOOL C串口v2Dlg::OnInitDialog(),将对话框代码完善,添加代码的作用是增加串口选择,和波特率选择:
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
// 串口选择组合框
CString str;
int i;
for(i = 0; i < 15; i++)
{
str.Format(_T("COM %d"), i+1);
m_comb1.InsertString(i, str); //将COM 1-15填入comb1
}
m_comb1.SetCurSel(0); //预置为COM 1
//波特率选择组合框
CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"),
_T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};
for(i = 0; i < 12; i++)
{
int judge_tf = m_comb2.AddString(str1[i]);
if((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE))
MessageBox(_T("Build baud error!"));
}
m_comb2.SetCurSel(5); //预置波特率为9600
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
编译成功后,在保存目录下的Debug目录下,找到可执行文件。进入测试。
效果图
四、测试
http://download.csdn.net/detail/axiqia/9466672,安装成功后: