位置:51电子网 » 技术资料 » 单 片 机

PC机与PIC单片机串行通讯的实现

发布时间:2008/5/27 0:00:00 访问次数:684

随着计算机应用技术和微机网络技术的发展,计算机与其外部设备之间的数据传输越发显得重要。而串行通讯技术是实现这一功能的有效途径,他具有使用方便、数据传输可靠、适用于远距离通讯的特点,在工业监控、数据采集、检测等系统中有着广泛的应用。
1 异步串行通讯的原理及硬件电路的实现

1.1 异步串行通讯的原理

在异步通讯中,数据是一帧一帧传送的,其数据格式如图1所示。


在帧格式中,一个字符由4部分组成:起始位、数据位、奇偶校验位和停止位。首先是一个起始位"o",然后是5~8位数据(规定低位在前,高位在后),接下来是奇偶校验位(可省略),最后是停止位"1"。起始位"o"信号只占用1位,用来通知接收设备一个待接收的字符开始到来。线路上在不传送字符时应保持为"广。接收端不断检测线路的状态,若连续为"1"以后又检测到一个"o",就知道发来一个新字符,应马上准备接收。

1.2 硬件电路的实现

pc机与picl6c711单片机之间的串行异步通讯采用rs232接口电路实现,利用计算机的串行接口进行数据传输。因为rs232逻辑电子对地是对称的,与tti。,cmos逻辑电平完全不同。逻辑"1"电平为一5~15v之间,逻辑电平"0"为+5~15v之间,其与单片机的逻辑电平不一致,必须进行电子转换,采用mcl488和mcl489芯片可分别实现ttl-rs232和rs232-ttl之间的电平转换。接口电路图如图2所示。

2 pc机通讯程序的编制

利用vc++6.0在windows 98以上的环境下运行,vc实现串行通讯有3种途径:

(1)利用mscomm控件,他是microsoh公司提供的简化windows串行通讯编程的activex控件,他为应用程序提供了处理串行通讯的2种方法:数据驱动法和查询法;

(2)利用cseria1pont类进行串口通讯,他适合于需要使用多个串口时的通讯;

(3)用win api函数对串口进行操作。

本文以vc++6.0调用win api函数为例编程实现。win api函数对串口进行操作不是对端口直接进行读写,而是把所有的设备都看成文件,从而进行相应的文件操作。

第1步,在mainform.cpp定义全局变量handle hcom;//准备打开的串口的句柄handleh comm watchthread;//辅助线程的全局函数

第2步,打开串口,设置串口hcom=createfile(〞coml〞,generic_read︱generic_write,null, open_existing, file_ flag_overlapped,null);//这里,我们使用file_flag_overlapped结构,这正是使用api函数实现非阻塞通讯的关键所在。

assert(hcom! =invalid handle value);
//检测打开串口操作是否成功
setcommmask(hcom,evrxchar ievtxempty);
//设置事件驱动的类型
setupcomm(hcom,1024,512); //设置输入缓冲区的大小
purgecomm (hcom, purge txabort ︱ purge rxabort︱purgetxclear︱purge rxclear);
//清理输入输出缓冲区
commtimeouts comm丁imeouts;
//定义超时结构,井填写该结构
setcommtimeouts (hcom,&commtimesouts);
//设置读写操作所允许的超时
dcb dcb; //设置数据控制快的结构
dcb.baudrate=9600; //设置波特率
dcb.bytesze=8;
dcb.stopbits=onestopbit;
dcb.fbinary=true; //二进制通讯格式
dcb.fpar北y:false;
setcommstate(hcom,&dcb) //串口参数配置

第3步,启动一个辅助线程,用于串口事件的处理。这里用他来监视串口状态,主线程则可专心进行数据处理。

hcommwatchthread =createthread ((lpsecurity_attributes) null, (lptheard_ start - routine) commwatchproc, getsafehwnd ( ),&dwthreadid);
assert(hcommwatchthread! =null);

第4步,要为辅助线程写一个全局函数,主要完成数据接收的工作。

unit commwatchproc(hwnd hsendwnd)
{dword dwevtmask=0;
setcommmask(hcom,ev_rxchar︱ev_ _txempty);
//有哪些串口事件需要监视
waitcommevent(hcom,&a

随着计算机应用技术和微机网络技术的发展,计算机与其外部设备之间的数据传输越发显得重要。而串行通讯技术是实现这一功能的有效途径,他具有使用方便、数据传输可靠、适用于远距离通讯的特点,在工业监控、数据采集、检测等系统中有着广泛的应用。
1 异步串行通讯的原理及硬件电路的实现

1.1 异步串行通讯的原理

在异步通讯中,数据是一帧一帧传送的,其数据格式如图1所示。


在帧格式中,一个字符由4部分组成:起始位、数据位、奇偶校验位和停止位。首先是一个起始位"o",然后是5~8位数据(规定低位在前,高位在后),接下来是奇偶校验位(可省略),最后是停止位"1"。起始位"o"信号只占用1位,用来通知接收设备一个待接收的字符开始到来。线路上在不传送字符时应保持为"广。接收端不断检测线路的状态,若连续为"1"以后又检测到一个"o",就知道发来一个新字符,应马上准备接收。

1.2 硬件电路的实现

pc机与picl6c711单片机之间的串行异步通讯采用rs232接口电路实现,利用计算机的串行接口进行数据传输。因为rs232逻辑电子对地是对称的,与tti。,cmos逻辑电平完全不同。逻辑"1"电平为一5~15v之间,逻辑电平"0"为+5~15v之间,其与单片机的逻辑电平不一致,必须进行电子转换,采用mcl488和mcl489芯片可分别实现ttl-rs232和rs232-ttl之间的电平转换。接口电路图如图2所示。

2 pc机通讯程序的编制

利用vc++6.0在windows 98以上的环境下运行,vc实现串行通讯有3种途径:

(1)利用mscomm控件,他是microsoh公司提供的简化windows串行通讯编程的activex控件,他为应用程序提供了处理串行通讯的2种方法:数据驱动法和查询法;

(2)利用cseria1pont类进行串口通讯,他适合于需要使用多个串口时的通讯;

(3)用win api函数对串口进行操作。

本文以vc++6.0调用win api函数为例编程实现。win api函数对串口进行操作不是对端口直接进行读写,而是把所有的设备都看成文件,从而进行相应的文件操作。

第1步,在mainform.cpp定义全局变量handle hcom;//准备打开的串口的句柄handleh comm watchthread;//辅助线程的全局函数

第2步,打开串口,设置串口hcom=createfile(〞coml〞,generic_read︱generic_write,null, open_existing, file_ flag_overlapped,null);//这里,我们使用file_flag_overlapped结构,这正是使用api函数实现非阻塞通讯的关键所在。

assert(hcom! =invalid handle value);
//检测打开串口操作是否成功
setcommmask(hcom,evrxchar ievtxempty);
//设置事件驱动的类型
setupcomm(hcom,1024,512); //设置输入缓冲区的大小
purgecomm (hcom, purge txabort ︱ purge rxabort︱purgetxclear︱purge rxclear);
//清理输入输出缓冲区
commtimeouts comm丁imeouts;
//定义超时结构,井填写该结构
setcommtimeouts (hcom,&commtimesouts);
//设置读写操作所允许的超时
dcb dcb; //设置数据控制快的结构
dcb.baudrate=9600; //设置波特率
dcb.bytesze=8;
dcb.stopbits=onestopbit;
dcb.fbinary=true; //二进制通讯格式
dcb.fpar北y:false;
setcommstate(hcom,&dcb) //串口参数配置

第3步,启动一个辅助线程,用于串口事件的处理。这里用他来监视串口状态,主线程则可专心进行数据处理。

hcommwatchthread =createthread ((lpsecurity_attributes) null, (lptheard_ start - routine) commwatchproc, getsafehwnd ( ),&dwthreadid);
assert(hcommwatchthread! =null);

第4步,要为辅助线程写一个全局函数,主要完成数据接收的工作。

unit commwatchproc(hwnd hsendwnd)
{dword dwevtmask=0;
setcommmask(hcom,ev_rxchar︱ev_ _txempty);
//有哪些串口事件需要监视
waitcommevent(hcom,&a

相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!