串口通信基础知识及VC++实现
来源:互联网 发布:淘宝店铺活动方图800 编辑:程序博客网 时间:2024/06/06 01:20
串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是由于串口通信是异步的,串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
而在VC++中实现串口通信也是一名VC程序员必须要掌握的技能。下面结合实例详细介绍在VC++中实现串口通信的过程(完整的实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/6408513)。
在这个实例中,实现了系统中可用串口的自动检测(通过注册表信息)、打开、发送、接收、关闭等基本的操作,若将串口线的TX(发送)和RX(接收)引脚连起来,便采用了“一根线发送数据的同时用另一根线接收数据”的方式测试了发送和接收功能的可用性和正确性。该实例对于初学者学习和掌握基于VC的串口通信将会有非常大的帮助。
(1)实例中所要用的主要控件及其属性、事件设置情况:
控件
ID
caption
绑定变量
绑定事件
组合框
IDC_COMBO1
-
CComboBox m_com;
-
按钮
IDC_BUTTON1
打开
CButton m_open;
OnBnClickedButton1()
按钮
IDC_BUTTON2
发送
CButton m_send;
OnBnClickedButton2()
按钮
IDC_BUTTON3
关闭
CButton m_close;
OnBnClickedButton3()
编辑框
IDC_EDIT1
发送输入
CString m_sendstr;
-
编辑框
IDC_EDIT2
接收显示
CString m_receivestr;
-
MSComm
IDC_MSCOMM1
-
CMSComm m_ctrlComm;
OnComm()
(2)需要的硬件条件及情况说明:
需要一根串口线,一端接在PC的某个串口上,另一端的TX引脚和RX引脚用铜线连接起来,这样便形成了一个回路,数据发送通过TX引脚出去后,又从RX引脚进来,程序中便可以得到接收到的数据了,接收到的数据应该和发送的数据一致,说明串口的发送、接收操作成功了。(3)COM组件(MSComm控件)消息响应宏定义的重要注意点:
BEGIN_EVENTSINK_MAP (CPoint20Dlg, CDialog) ON_EVENT (CPoint20Dlg, IDC_MSCOMM1, 1, OnComm, VTS_NONE)END_EVENTSINK_MAP ()
(4)从注册表中检测系统中可用串口并添加到界面组合框中:
HKEY hKey;int rtn; rtn = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm", NULL, KEY_READ, &hKey); if( rtn == ERROR_SUCCESS) // 打开串口注册表{ int i=0; char portName[256], commName[256]; DWORD dwLong,dwSize; while (1){ dwSize = sizeof(portName);dwLong = dwSize; rtn = RegEnumValue ( hKey, i, portName, &dwLong, NULL, NULL, (PUCHAR)commName, &dwSize ); // 枚举串口if( rtn == ERROR_NO_MORE_ITEMS ) break; // commName就是串口名字m_com.AddString(commName);// 将可用串口添加到界面组合框i++;}RegCloseKey(hKey);}m_com.SetCurSel(0);
(5)打开并设置串口参数:
if (!m_ctrlComm.GetPortOpen()){char commName[256];//串口名m_com.GetWindowText (commName, 256);m_ctrlComm.SetCommPort(_ttoi(&commName[3]));//从串口名中得到串口号m_ctrlComm.SetInputMode (1);m_ctrlComm.SetSettings ("9600, n, 8, 1");m_ctrlComm.SetPortOpen (TRUE);m_ctrlComm.SetRThreshold (1);m_ctrlComm.SetInputLen (0);m_ctrlComm.GetInput ();MessageBox(" 串口已打开 ");}elseMessageBox("没有发现此串口或被占用");
(6)发送数据:
if (m_ctrlComm.GetPortOpen()){UpdateData();CByteArray sendArr;//欲发送的数据,需从CString转化为CByteArray型WORD wLen;wLen=m_sendstr.GetLength();sendArr.SetSize(wLen);for (int i=0;i<wLen;i++){sendArr.SetAt(i,m_sendstr.GetAt(i));}m_ctrlComm.SetOutput (COleVariant (sendArr));//发送数据}elseMessageBox("串口未打开");
(7)接收数据(onComm()函数):
VARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[6000];CString strtemp; if (m_ctrlComm.GetCommEvent()==2){variant_inp=m_ctrlComm.GetInput ();safearray_inp=variant_inp;len=safearray_inp.GetOneDimSize();for (k=0;k<len;k++){safearray_inp.GetElement(&k,rxdata+k);BYTE bt=*(char*)(rxdata+k); //strtemp.Format(_T("%02X"),bt);//十六进制格式接收strtemp.Format(_T("%c"),bt);//字符格式接收m_receivestr+=strtemp;}UpdateData(FALSE);}
(8)关闭串口:
if(m_ctrlComm.GetPortOpen()){m_ctrlComm.SetPortOpen (FALSE);MessageBox("串口已关闭");}
(9)实例效果图:
- 串口通信基础知识及VC++实现
- VC++串口通信基础知识
- VC串口通信简介及代码实现
- VC实现串口通信例程
- VC实现串口通信例程
- VC实现串口通信例程
- VC实现串口通信例程
- VC实现串口通信例程
- VC实现串口通信例程
- VC实现串口通信例程
- VC++控件实现串口通信
- VC实现串口通信例程
- VC++ API实现串口通信
- VC 串口通信实现方式
- VC 6.0 实现串口通信
- Delphi使用spcomm实现串口通信 基础知识及(两个实例)
- Delphi使用spcomm实现串口通信 基础知识及(两个实例)
- VC实现串口通信例程zt
- Cocos2d-x 动作之瞬时动作
- SNMP MIB中的含read-create节点的表的实现
- 国际知名大学计算机视觉研究小组列表
- ScrollView中嵌套GridView,Listview的办法
- hiRedis Synchronous API
- 串口通信基础知识及VC++实现
- LInux5.5部署Tomcat6 jdk1.6
- [翻译]jQuery Mobile入门教程——主题的使用和定制
- Selenium WebDriver如何使滚动条滚动到最元素位置
- mysql配置主从
- 1067. Sort with Swap(0,*)
- php代码优化 细节方案
- MYSQL中日期与字符串间的相互转换
- MacBook终端命令创建Cocos2D-x游戏项目