异步串行通信文档(7)

2019-03-27 18:49

3.3虚拟串口工具的使用

1) 由于计算机一般只有一个串口,或者类似笔记本直接没有串口,串口通信就成

了空话,故而本次课程设计需要在计算机端虚拟两个串口以便仿真; 2) 安装VSPD软件,即Virtual Serial Port Driver,运行软件并添加一对串口COM1

与COM2,此时添加的两个串口已经相互连接,相当于一条串口已经连接上了,在计算机的设备管理器中可以看到效果;

图3.36 虚拟一对串口

图3.37 设备管理器中出现的串口

3) 在单片机端程序与PC端程序编写完成的情况下,可以利用虚拟的串口来实现

串口通信。效果可以见两者仿真的截图。

` 28

参考文献

[1] 胡伟. 单片机C程序设计及应用实例. 北京:人民邮电出版社,2003 [2] 韩毅刚.计算机通信技术. 北京市:北京航空航天大学出版社,2007

[3] 李朝青. 单片机与PC机网络通信技术.北京:北京航空航天大学出版社,2007

` 29

总 结

这次针对单片机端与PC端串口通信的课程设计,工作主要分为两部分,一部分在于硬件,一部分在于软件。就硬件而言,由于实际准备得不足,在电路上缺少了电平转换芯片MAX232,导致计算机串口与单片机串口并不能连接通信,因而只能在软件将其电路图仿真出来,并没有连接实际电路,这是缺陷;但就软件而言,就比较成功,软件设计也分为两部分,单片机端程序与计算机端程序,利用Keil软件和VC++编写的两段程序之间能够完美互通数据。此次课程设计主要的难题其实也就集中软件方面,两端程序的编写是否成功决定了在理论上是否能够用串口通信。单片机端程序中难点在于各种串口相关的标志,例如发送中断标志,接收中断标志,定时器工作方式等,只有在程序初始化中将单片机的状态调试好,才能实现收发数据功能;计算机端程序中难点在于对于VC++的不熟悉,虽然有不少可以参考的程序代码,但其中出现的错误会让门外汉束手无策,只有修正之后才能真正运行。

通过这次课程设计,我学到了很多关于单片机编程的知识,更是深入了解了单片机端与PC端串口通信的原理。在有了理论基础的情况下,动手实践就成了一件并不困难却势在必行的事情,而动手实践本身又会加强对理论的理解。两者相辅相成,就会形成一股推动实践者前进的力量,也正是这股力量,才使得我们能够在未来的路上越走越远。

` 30

附 录

1.在COMPORTDlg.cpp需要插入的代码: BOOL CCOMPORTDlg::OnInitDialog() { // TODO: Add extra initialization here //初始化串口 if(m_Comport.GetPortOpen()) m_Comport.SetPortOpen(FALSE); m_Comport.SetCommPort(2); //选择COM2 if(!m_Comport.GetPortOpen()) m_Comport.SetPortOpen(TRUE); else AfxMessageBox(\ m_Comport.SetSettings(\ m_Comport.SetInputMode(1); //以二进制读取数据 m_Comport.SetRThreshold(1); //多于一个字符触发事件 m_Comport.SetInputLen(0); //接收缓冲区全部内容 return TRUE; // return TRUE unless you set the focus to a control }

void CCOMPORTDlg::OnOnCommMscomm1() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; CString strtemp; if(m_Comport.GetCommEvent()==2) //事件值为2,表示缓冲区有字符 { variant_inp=m_Comport.GetInput(); //读取缓冲区 safearray_inp=variant_inp; //VARIANT变量转换为ColeArray变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k

void CCOMPORTDlg::OnButtonTrans() { // TODO: Add your control notification handler code here UpdateData(TRUE); `

31

m_Comport.SetOutput(COleVariant(m_tdata)); //发送数据 }

2.单片机端的核心程序PortTR.c: #include

#define uchar unsigned char #define uint unsigned int uchar i=0;

void init_chuankou() {

TMOD=0x20; //设置定时器1 TH1=0xfd; //设置波特率9600 TL1=0xfd;

SM0=0; //设置工作方式1,波特率可变,由定时器决定 SM1=1;

REN=1; //允许接收 EA=1; //中断开关开 TR1=1; //启动定时器1 ES=1; //允许串行接口中断 }

void main() {

init_chuankou(); //初始化串口的子函数 while(1) //等待中断 { } }

void es() interrupt 4 //中断函数,串口中断号4 {

if(RI) //串口接收数据完毕后会申请中断,由硬件置1,处于不能接收的状态,故须软件清0方可接收 {

RI=0; //接收中断标志置0,等待接收

i=SBUF; //自行判断,若有输出,则判定为接收,将缓冲区的信息存入自定义变量

SBUF=i; //若有输入,则判定为发送,将发送的信息送入缓冲区

while(TI==0); //串口发送数据完毕后会由硬件置1,处于不能发送的状态,故须软件清0方可发送

TI=0; //发送中断标志置0,等待发送 } }

3.单片机端的调试配置文件Debug.ini: MODE COM1 9600,0,8,1

ASSIGN COM1 SOUT

` 32


异步串行通信文档(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国保时捷汽车行业发展研究报告 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: