串口编程(VS2010)
Posted axiqia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串口编程(VS2010)相关的知识,希望对你有一定的参考价值。
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软件,绘制界面;
- 我们要用到就是对话框模块,所以选择如下图所示
- 点击下一步至完成。
我们可以看到就绪之后的界面如下图所示,按照步骤把原来的静态文本框和确定按钮、取消按钮删掉;
二、为我们的对话框添加控件
- 添加两个组合边框,并放置好位置;
- 修改组合边框显示的名称;
- 在组合边框里面添加编辑文本框;
在这一步一定要小心选择右边的属性;
二、添加控件和变量
- 这一步是把串口控件添加到对话框中来;
- 给四个控件(两个输入区域,一个选择串口,一个波特率)添加变量 控件处右键,添加变量
- 接受区域,变量名最好和实例一样,否则后面程序也需要修改
- 其他三个区域相同方法
- 选择串口和波特率为control
串口控件为public
三、为按钮和串口控件添加程序函数
- 双击打开串口按钮,进入相应的编程部分
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目录下,找到可执行文件。进入测试。
效果图
四、测试
- 下载虚拟串口工具Virtual Serial Port Driver(VSPD)
http://download.csdn.net/detail/axiqia/9466672,安装成功后:
- 添加两个匹配的虚拟串口:
- 打开两个串口程序
在同波特率下,一个选择串口1, 一个选择串口2, 测试结果如下。
以上是关于串口编程(VS2010)的主要内容,如果未能解决你的问题,请参考以下文章