计算机网络实验vc6实现串口通信,串口通信基础知识及VC++实现

串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是由于串口通信是异步的,串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

而在VC++中实现串口通信也是一名VC程序员必须要掌握的技能。下面结合实例详细介绍在VC++中实现串口通信的过程(完整的实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/6408513)。

在这个实例中,实现了系统中可用串口的自动检测(通过注册表信息)、打开、发送、接收、关闭等基本的操作,若将串口线的TX(发送)和RX(接收)引脚连起来,便采用了“一根线发送数据的同时用另一根线接收数据”的方式测试了发送和接收功能的可用性和正确性。该实例对于初学者学习和掌握基于VC的串口通信将会有非常大的帮助。

(1)实例中所要用的主要控件及其属性、事件设置情况:

控件IDcaption绑定变量绑定事件

组合框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;-

MSCommIDC_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, "HardwareDeviceMapSerialComm", 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(" 串口已打开 ");

}

else

MessageBox("没有发现此串口或被占用");

(6)发送数据:

if (m_ctrlComm.GetPortOpen())

{

UpdateData();

CByteArray sendArr;//欲发送的数据,需从CString转化为CByteArray型

WORD wLen;

wLen=m_sendstr.GetLength();

sendArr.SetSize(wLen);

for (int i=0;i

sendArr.SetAt(i,m_sendstr.GetAt(i));

}

m_ctrlComm.SetOutput (COleVariant (sendArr));//发送数据

}

else

MessageBox("串口未打开");

(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

{

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)实例效果图:

1936cf721698650c557f8d4cce968361.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值