- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VC的串口通信简介
vc++实现PC与单片机的串口通讯 修正版
2009-05-31 17:56
实验实现的功能主要是:用PC上的一个软件通过串口通讯控制单片机I/O口的输出。本次实验主要涉及PC端上位机的程序编写(用VC)与单片机程序的编写(用Keil)。为了简化实验,PC端软件设计成具有8个按钮的对话框,每个按钮分别控制单片机P2口的一个引脚的高低电平。为了体现直观的结果,P2口上接上8个发光二极管。
PC与单片机的通讯协议如下:采用4800波特率,无校验位,8个数据位,1个停止位,一次传输一个控制字节。
一、上位机软件的编写
本来控制单片机只需单向传输数据即可,为了熟悉PC端接受数据的功能,在应用软件将控制数据传输到单片机端后,单片机端回传数据给应用软件,并用16进制格式显示在编辑控件中。
VC实现对串口的控制主要有两种方式:mscomm控件与api函数。由于mscomm控件实现简单,本实验采用该方式。
1. 在VC中创建一个基于对话框的应用程序,在该程序中插入Mscomm控件。修改对话框资源,增加Mscomm及8个按钮控件与一个编辑框。并为Mscomm控件增加一个控件变量m-com。
2. 在对话框的OnInitDialog 函数中初始化串口,代码如下:
if m_com.GetPortOpen m_com.SetPortOpen FALSE ;
m_com.SetCommPort 1 ;//选择com1
if !m_com.GetPortOpen m_com.SetPortOpen TRUE ;//打开串口
else
MessageBox 无法打开串口! ;
m_com.SetInBufferSize 1024 ; //接收缓冲区长度
m_com.SetOutBufferSize 1024 ;//发送缓冲区长度
m_com.SetOutBufferCount 0 ;//清空输出缓冲区
m_com.SetSettings 4800,n,8,1 ;//波特率4800,无校验,8个数据位,1个停止位
m_com.SetInputMode 1 ; //1:表示以二进制方式检取数据
m_com.SetRThreshold 1 ;//参数1表示每当串口接收缓冲区中有多于 //或等于1个字符时将引发一个接收数据的OnComm事件
m_com.SetInputLen 0 ; //参数为0表示事件触发时读取接收缓冲区中全部内容, //参数为1表示事件触发时读取接收缓冲区中一个字符.
m_com.GetInput ;//先预读缓冲区以清除残留数据
3.为每个按钮添加命令函数。下面为其中一个函数的代码,其他与此类似。
void CComDlg::OnP20 // TODO: Add your control notification handler code here
byte bytSend[1];// byte unsinged char ,COledVariant类不能构造unsinged char的对象.CByteArray?? arraySend; //构造一个空的字节数组
bytSend[0] 0x86;arraySend.RemoveAll ;?? // 删除数组中所有的元素arraySend.SetSize 1 ;??? //设置数组元素的个数arraySend.SetAt 0,bytSend[0] ;??? // 给数组中指定下标的元素赋值,但不能动态增长数组(指定的下标不能越界)?? m_com.SetOutput COleVariant arraySend ; 4.接受数据时采用Mscomm控件的响应函数进行对事件的捕捉。处理代码如下:
void CComDlg::OnComm // TODO: Add your control notification handler code here
VARIANT Input;
CString temp;
long k,len;
COleSafeArray OleArray;//构造一个任何类型的空数组.
BYTE rxdata[10];
if 2 m_com.GetCommEvent Input m_com.GetInput ;
OleArray Input;//VARIANT型变量转换为ColeSafeArray型变量
len OleArray.GetOneDimSize ;//获取接收到的字符数.也可使用m_com.GetInBufferCount 获取字符数.
for k 0;k len;k++ OleArray.GetElement k,rxdata+k ;//将OleArray数组中第K个元素赋予BYTE数组中第K个元素. BYT
文档评论(0)