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

发布者:代码漫游者最新更新时间:2010-08-11 关键字:串行通信  PC机  PIC单片机 手机看文章 扫描二维码
随时随地手机看文章

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

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,&dwEvMask,Os);
//等待串口通讯事件的发生
If(dwEvtMask&EV_RXCHAR)= =EV_RXCHAR)
//缓冲区中有数据到达
{COMSTART ComStari;
DWORD dwLenlgth;
ClearCommError(hCom,&dwErrorFlags,&ComStart);
DwLength=ComStat.cbInQuei ; //输入缓冲区有多少数据
If(dwLenlTth>0)
{BOOL fReadStari
fReadStat = =ReadFile (hCom, 1pBuffer,dwLength,
&dwBytesRead,,&Read_OS(npTTYInfO));
//读数据因为使用1pOverlapped结构,ReadFile()立即返回
FALSE;
If(! fReadStat)
{if(GetLastError()= =ERROR_IO_PENDIN)
{while (! GetOverLappedReault (hCom,&READ_OS
(opTTYInfo),&dwNytesRead,TRUE)
{dWError=GetlastError();
if(dwError==ERROR_IO_INCOMPLETE)
CONTINUE; //缓冲区数据没有读完,继续
……}
∷ PostMessage (( HWND ) hSendWnd, WM
NOTIFYPROCESS,0,0); //通知主线程,串口接到数据}

  第5步,在主线程中发送下行命令:

BOOL f WriteStat;
Char szBuffer[count];
//准备好发送的数据,放在szBuffer[]中
FWrirteStar=WriteFile(hCom,szBuffer,dwbytesToWrite,
&dwBytesWritten&WRITE_OS(npTTYInof));
int err=GetLastError();
if(!fWriteStat){if(GetLastError()= =ERROR_IO_PENDING)
{while (! GetOverlappedResult (hCom,&WRITE OS
(npTTYInfO),&dwBytesWritten,true))
{dwError=GetLasrError();
if(dwError= =ERROR_IO_INCOMPLETE)
{dwBytesSent+=dwbytesWritten;
continue;))}}

3 PIC"C711单片机串行通讯的实现

  本文以单片机对温度传感器DSl820进行数据采集为例,实现单片机与PC机的通讯。限于篇幅,给出传送一个DSl820信号到串口的主要部分程序:

A2 EQU 2 //RA2接收数据端
A1 EQU 1 //RAl发送数据
RCVREG EQU 26
R-COUNT EQU 27 //接收数据计数器
T-COUNT EQU 28 //发送数据计数器
MSB EQU 7
NUM EQU 6B //设置下位机序号67
NUM-ADDR EQU 2A //存储本机号码的地址
SEN-CODE EQU 39 //传感器信号存放地址
MAIN CALL SUB-INIT //初始化程序
CALL SUB-REC //调用接收子程序
CALL SUB_ COMP //对接收的数据进行处理
CALL
SUB_TRANS //发送数据子程序
GOTO
EXIT
SUB_INITCLRF RA
BCF STATUS,RP0
MOVLW B'00001101' //初始化MOVWF
TRISA
MOVLW NUM
MOVWF NUM
RETURN
SUB-REC
RCVR BTFSCRA,A2 //检测起始位
GOTO RCVR // 未检测到
MOVL W2 //接收的数据位数
MOVWF R_COUN
R_NEXTCALL DELAY //调用延时程序
BCF STATUS,C
RRF RCVREG
BTFSC RA,A2
BSF RCVREG,MSB
CALL DELAY
DECFSZ R_COUNT
GOTO R_NEXT
RETURN
SUB_COMPMOVLW 6A
MOVWF CONT
MOVFCONT,W
XORWF NUM_ADDR,1 MOVLW
1 ;
ADDWF NUM_ADDR,1 DECFSZ
NUM-ADDR,1
GOTO EXIT
NOP
OVERNOP
RETURN
SUB_TRANSMOVLW 3 //发送的数据位数
MOVWF T_ COUNT
MOVLW 2A
MOVWF SEN_CODE
BCF RA,A1 //设置发送起始位0
T_NEXTCALL DELAY
RRF SEN_CODE
BTFSC STATUS,C
BSF RA,A1 //发送数据位"1"
BTFSS STATUS,C
BCF RA,A1 //发送数据位"0"
DECFS2T_COUNT
GOTO T_NEXT
CALL DELAY
BSF RA,A1 //发送停止位
RETURN
EXITNOP
END

4 结 语

    本文所论述的通讯方法曾在对气体传感的在线检测中应用,由于DSl820为数字传感器,因此利用单片机可直接对 DSl820操作,将温度值存储在单片机通用寄存器中,通过VC调用WinAPI函数对串口读写,可将温度值及气体传感器信号采集到PC机界面,从而实现对气体传感器在不同温度值下的在线检测。实践证明,利用VC开发通讯系统,从底层到上层直接面向用户,具有很强的调试功能,采用文中所述的方式构建的通讯在线检测系统工作稳定,数据传输可靠。

关键字:串行通信  PC机  PIC单片机 引用地址:PC机与PIC单片机串行通讯的实现

上一篇:Microchip公布一季度财报,净利润同比增两倍
下一篇:Microchip超低功耗 XLP 系列新增高密度 8 位单片机

推荐阅读最新更新时间:2024-03-16 12:29

PIC单片机的多字节减法子程序
  ;本程序实现多字节无符号数减法。   ;入口参数:减数首地址在DADR中,被减数首地址在SADR中,字节数在CNT中。   ;出口参数:结果首地址在SADR中,字节数在CNT中,借位标志在STATUS:C中,'0'表示有借位。   ;占用资源:W,FSR,STATUS,020H,021H,022H,023H,028H,029H,一重堆栈。   ;说明: 1.程序执行后,被减数被冲掉。   IFNDEF MUSUB1   #DEFINE MUSUB1   MUSUB MOVF SADR,W   MOVWF SADRH ;保护结果首地址   CLRF TEMP2 ;
[单片机]
RS485/RS232转换器实现PC机和单片机之间的串行通信
1、RS485串行通信接口电路的总体设计   在电参数仪的设计中,数据采集由单片机AT89C52负责,上位PC机主要负责通信(包括与单片机之间的串行通信和数据的远程通信),以及数据处理等工作。在工作中,单片机需要定时向上位PC机传送大批量的采样数据。通常,主控PC机和由单片机构成的现场数据采集系统相距较远,近则几十米,远则上百米,并且数据传输通道环境比较恶劣,经常有大容量的电器(如电动机,电焊机等)启动或切断。为了保证下位机的数据能高速及时、安全地传送至上位PC 机,单片机和PC机之间采用RS485协议的串行通信方式较为合理。   实际应用中,由于大多数普通PC机只有常用的RS232串行通信口,而不具备RS485通信接口。
[单片机]
RS485/RS232转换器实现<font color='red'>PC机</font>和单片机之间的<font color='red'>串行通信</font>
PIC单片机编制的可预置起始时刻的倒计时程序
  可预置起始时刻的倒计时程序,是作为日常生活中对某事件的定时之用:只要某事件由人工设置的计时时间到,倒计时电路便会发出报警声。倒计时的特点是,计时一旦达到预定值,其值就归零。利用归零条件,即可实现任意倒计时达到时的报警功能,提示人们定时已到。   本倒计时器可在0~99分钟内任意设置计时值。   例如在厨房中,蒸大米饭(8两米),定时33分钟,烧开水(一壶)为20分钟,煮胡罗卜(红色)为30分钟等,只要设定时间一到,倒计时器即报警,使用十分方便。当然,上述倒计时值,均是事先用普通时钟确定每个事件所要花费的时间,列出相应定时标准,才能用倒记时器进行定时。   (1)硬件电路   下图是0~99分钟可预置的倒计时电路。  
[单片机]
用<font color='red'>PIC单片机</font>编制的可预置起始时刻的倒计时程序
PIC单片机在汽车电动车窗控制器中的应用
  摘 要: 针对汽车控制系统减少线束和较低成本的要求,提出了以集成CAN控制器的PIC18F258单片机为核心设计而成的汽车电动车窗控制系统,给出了系统主要硬件结构和软件设计流程。相对于传统的点对点控制方式,不仅减少了车内的线束、降低了成本,而且控制灵活、实时性强。试验表明,该系统工作正常、性能可靠,具有低成本、低功耗和易于维修等优点。 随着汽车电子技术的发展,越来越多的电子产品装载到汽车上,极大地提高了汽车的动力性和舒适性,同时也增加了车内布线的难度和成本。CAN(Controller Area Network)作为一种串行数据通信总线,由于具有良好的可靠性、实时性及灵活性,已经成为国际标准(ISO11898)
[汽车电子]
<font color='red'>PIC单片机</font>在汽车电动车窗控制器中的应用
PIC单片机-直流电机无级调速
现代工业生产中,电动机是主要的驱动设备,目前在直流电动机拖动系统中已大量采用晶闸管(即可控硅)装置向电动机供电的KZ—D拖动系统,取代了笨重的发电动一电动机的F—D系统,又伴随着电子技术的高度发展,促使直流电机调速逐步从模拟化向数字化转变,特别是单片机技术的应用,使直流电机调速技术又进入到一个新的阶段,智能化、高可靠性已成为它发展的趋势。本调速系统采用PIC16F874单片机作为中心处理器,充分利用了PIC16F874单片机捕捉、比较、模/数转换模块的特点作为触发电路,其优点是:结构简单,能与主电路同步,能平稳移相且有足够的移相范围,控制角调整量可达10000步,能够实现电机的无级平滑控制,脉冲前沿陡且有足够的幅值,脉宽可设定,稳
[单片机]
<font color='red'>PIC单片机</font>-直流电机无级调速
基于PIC单片机的智能小区监控系统的设计
1. 引言 随着生活水平的不断提高,人们对居住环境的要求也大大提高,对信息服务和安全防范的要求尤为突出.如何利用计算机和通信技术在智能化小区家庭智能管理系统中,对住户家庭水表、电表、煤气表的自动计量以及火灾、煤气泄漏、入室盗窃等警情的实时监控已经成为信息产业的热点技术.利用CAN总线技术虽然有其开放式、数字化、多点通信等诸多优点,但将其用于智能住宅小区,却因其成本偏高,目前在我国还难以推广.为此,作者开发出一种设备简单,成本低廉,便于维护经济型智能小区家庭管理系统,能有效地实现三表自动采集计费,防盗、防灾、自动报警和远程监控等功能.利用单片机进行实时采集,并将采集的数据通过串行口传给PC机,PC机完成数据的运算、存储、和打印
[单片机]
基于<font color='red'>PIC单片机</font>的智能小区监控系统的设计
PIC单片机中断程序的设计技巧
所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,
[单片机]
基于PIC单片机的CAN总线扩展技术
0 引 言 CAN总线是一种串行多主站局域网总线,被广泛应用于汽车控制系统、自动控制、楼宇自动化、医学设备等各个领域。其传输距离远,最远可达10 km,传输速率高,最高可达1 Mb/s,容错性能好,可靠性能高。但是由于CAN驱动器的驱动能力有限,CAN总线能够驱动的节点数有限,一般在100个左右,同时会随着传输距离的增加,最高传输速率会下降,如果距离过长会引起信号丢失、反射等故障。在实验室条件下测得在5 Kb/s的通信速率下最远通信距离能达到10 km;在18 Kb/s的通信速率下最远通信距离只能达到2 km;而在42 b/s的通信速率下,最远通信距离只能达到1 km。测试条件:线缆采用线径为0.75 mm2的屏蔽双绞线,线
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved