论文价格 论文发表支付方式 论文汇款遗失 论文汇款确认 论文服务投诉指南

网站服务

    论文定制 论文代谢

    诚邀更多有实力的作者加入合作行列

    论文检测

论文分类

论文写作指导

·论文写作指导

经济学论文

·财政税收 ·发展战略 ·新经济学 ·中国经济 ·地方战略 ·行业经济 ·经济学理论 ·国际贸易 ·证券金融 ·经济其它相关
管理学论文
·会计审计 ·基本理论 ·成本管理 ·旅游管理 ·工商管理 ·财务管理 ·公共管理 ·市场营销 ·人力资源管理 ·行政管理 ·秘书文秘 ·档案管理 ·管理其它相关
法学论文
·民法 ·经济法 ·国际法 ·法学理论 ·司法制度 ·国家法、宪法 ·刑法 ·行政法
理学论文
·物理学 ·统计学 ·理学其它相关 ·数学 ·农林学类 ·地理地质
工学论文
·计算机 ·通信学 ·电子机械 ·工程建筑 ·材料工程学 ·交通运输 ·工业设计 ·环境工程 ·电力 ·水利工程
计算机论文
·计算机应用 ·计算机理论 ·计算机网络
医药论文
·药学 ·医学 ·临床医学
文学论文
·汉语言文学 ·古代文学 ·新闻传播学 ·现当代文学
教育论文
·教育理论 ·基础教育 ·中等教育论文 ·高等教育论文 ·职业教育论文 ·心理学论文 ·学科教育论文 ·英语教学论文
艺术论文
·艺术理论 ·电视电影 ·音乐 ·美术
哲学论文
·逻辑学 ·中国哲学 ·西方哲学 ·思想哲学 ·科技哲学 ·美学 ·国学 ·哲学其它相关
文化论文
·历史学 ·传统文化 ·当代中国 ·西方文化 ·社会文化 ·文化研究 ·文化战略
政治论文
·民主制度 ·政治哲学 ·社会主义 ·资本主义 ·台湾问题 ·马克思主义 ·民族主义 ·政治其它相关
社会论文
·农村研究 ·人口问题 ·伦理道德 ·社会其它相关
英语论文

·外语翻译 ·语言文化 ·英美文学 ·英语其它相关

刊物合作信息 本站合作刊物总览
您当前位置:您当前位置:首页->工学论文->通信学->正文(目前国内最大最全原创最多的免费论文中心)

客服QQ咨询: 客服QQ:7992817 客服QQ:932633

无忧论文,让您轻松写作,轻松发表,轻松晋级!联系电话:020-31801568

还在为职称而烦恼?到论文发表中心填写订单,其他的交给我们!

找不到合适的论文?可以到论文定制中心由我们帮您解忧!论文最低定制价只须800元!

字号大小:


探讨串行通信的两种实现方法

作者: 整理:无忧论文网 录入时间:[10-10-15 08:18:41] 浏览点击数:

摘要:本文简要地叙述了基于单片机汇编语言的串行通信实现方法和基于VB6.0串行通信的实现方法,并对它们的前景进行了展望

关键词  单片机,汇编语言C/S模式,串行通信,MSComm 控件

一、单片机之间的全双工串行通信

1、 系统实现

在复位状态下,由于8052单片机的P0—P3口的内容都为0FFH,当然TXD,RXD也为1,如令对方的TXD为0,由于对方的TXD是与本方的RXD相连,所以只要查询本机的RXD位,当RXD=1,表示对方没准备好;RXD=0,表示对方已经准备好,以此来协调两台单片机之间的工作。

设置两个标志位:(30H)=0,表示发送没有结束; (30H)=1,表示发送已经结束。(20H)=0,表示接收没有结束;(20H)=1,表示接收已经结束。无忧论文网www.wypaper.com

2、程序

主程序:

ORG 1000H

CLR  20H

CLR  30H

MOV  R0,#20H

MOV  R1,#40H

CLR  TXD

JB  RXD,$  ;查询对方是否准备好

MOV  P3,#0FFH  ;恢复P3口的内容

MOV  PCON,#00H

MOV  SCON,#90H

SETB  EA

SETB  TI  ;开始人为把TI设置为1,否则无法进入中断程序

SETB  ES   ;开放串行中断

SJMP  $

ORG 0023H

LJMP  2000H

中断服务程序:

ORG 2000H

CLR  ES

JBC  RI,LOOP3

CLR  TI

MOV  A,@R0

JZ  LOOP1

MOV  SBUF,A

INC  R0

SETB  ES

RETI

LOOP1: SETB  30H

JB  20H,LOOP2  ;20H、30H都为1,表示接收和发送都已完成

SETB  ES

LOOP2: RETI

LOOP3: MOV  A,SBUF

JZ  LOOP4

MOV  @R1,A

INC  R1

SETB ES

RETI

LOOP4: SETB 20H

JB  30H,LOOP5    ;20H、30H都为1,表示接收和发送都已完成

CLR  REN

SETB  ES

LOOP5: RETI

3、 结果分析

两台单片机的源代码都一样,实验证明能较好地实现两台单片机之间的全双工串行通信。在系统实现的过程中,要注意两点:

①在开始进行串行通信时,人为把TI设置为1,否则TI永远为0,从而永远无法进入中断程序,当然也就无法进行正常的串行通信;

②为了避免在执行发送(接收)中断服务程序的过程中,出现接收(发送)中断请求而引起的混乱,在中断服务程序的入口处,加一条CLR  ES指令,禁止串行中断,在处理完后,加一条SETB  ES指令,来开放串行中断。

4、前景展望

如果是两台单片机之间进行串行通信,它们之间的协调比较容易实现,但如果是在C/S模式下进行串行通信,如何来协调它们之间的串行通信?

存在的问题及解决办法:

①服务器(上位机)向若干个客户端(下位机)发送数据时,先发送一个控制位,如为1,那么每一个客户端都接收下面要发送的数据,如为0,那么,接下来还要发送一个地址,每一个客户端与本机地址比较,如相符,则接收,否则,不接收;

②当有一个以上的客户端(下位机)要向服务器(上位机)上传数据时,就容易发生冲突,在本系统中,事先给每一个客户端分配一个优先级别(每一个客户端的20H位),在上传数据之前,先有20H位向服务器的7FH的相应位发送上传数据请求,服务器就可查询7FH的相应位,接收优先级别高的的客户端(下位机)上传来的数据。

在某院的宾馆,就是采用了这种基于C/S模式下单片机之间的串行通信,总台有一台PC机作为服务器(上位机),每一个客房有一个客户端(下位机),总台不仅能方便及时地每一个客房进行通信,而且当一个客房有请求时,尤其当发生一些异常情况时,通过本系统能方便及时地与总台联系。其实,按照该思想, 基于C/S模式下单片机之间的串行通信在其它领域也能得到广泛的应用。

二、利用 Visual Basic中的MSComm 控件实现串行通信

1、系统实现

利用Visual BasicMSComm控件实现串行通信功能,其程序的实现过程如图1所示。我们必须先要完成通信界面的初始化,打开通信端口,同时设置RTS信号为True,使其正式准备发送。由于硬件设备都有一个启动的延时时间,所以必须设置好这一时间。然后,通信控件将需要发送的数据发送到缓冲区中去,经由串口发送出去。同时将RTS设置为False

从接收缓冲区里接收数据时,也需要设置一定的接收延时时间,在延时时间内实现数据的接收。当接收延时时间结束时,就需要结束数据的接收,即使还没有完全接收完所需要的数据,也必须要结束此次数据的接收操作。当然,如果在接收时间内的接收数据不完全的话,也就是接收数据错误,需要做相应的处理工作。

如果是连续地进行查询操作,那么应该设置相应的间隔延时时间,因为两次不同的查询之间需要一定的时间来转换,以便防止两次操作的数据发生错误。如果是连续的查询,那间隔一定时间后,仍按原来的方式进行工作,但在这之前必须使站点号码累加1。如果不需要进行连续的查询工作,那么就结束这次串行通信工作。

2、串行通信的错误预防

在传输的过程中,数据可能受到任何的干扰而使得原来的数据信号发生扭曲,此时的数据当然是错误的,为了侦测数据在数据传送过程中发生的错误,传送和接收的双方必须对数据作进一步的确认工作,因此,需要使用校验编码来完成。在本实验中采用了CheckSum编码方法。

CheckSum的方法是就是将所有要传送的字符的ASCII码作一个总的计算,计算其和后将此数目与一数字(通常使255)作相除的操作,而取其余数,并将此余数组合成传送字符串的一部分而传送出去;同样地,接收数据的一方也以相同的方式将所传送过来的字符串作ASCII码的类加,并与传送过来的值作对比,如果其值一样,则代表传送过来的字符串是正确的,反之则是错误的;检查错误时,接收方可能要求对方重发,以确保数据的正确。

例如被传送的字符串为ABCDEF123它们的ASCII码相加的结果是(以10进制表示)

65+66+67+68+69+70+49+50+51=555

与255相除后取余数,其余数是45;因此传送此字符串时,必须在其字符串的尾端再加上一个ASCII码45的字符,加上之后的字符串再予以传送出去。对方收到所传送的字符串后,会再依以上的方式再作一次计算,如果计算出来的也是45的话,表示此次传送的字符串是正确的。 

3、串行通信界面的功能模块

如图2所示,系统开始运行时,用户应先们设置好界面上通信的各种参数(包括端口选择、参数选择、参数设置),然后单击“建立连接”按钮,打开通信端口,这时候通信的各种参数就不能再改变了。当单击“点名查询”按钮时,可以查询指定的站点的信息,同时显示在界面上。如果是连续查询,那么会逐一查询各个站点的信息,同时连续地显示在界面上。在此,接收方式是采用了控件的事件触发方式来实现的,即当有数据进入接收缓冲区时,且达到接收门槛值时,就会触发接收事件,自动地从接收缓冲区中接收数据。

当一切通信都完成以后,应该断开连接,关闭端口。只有在端口关闭的情况下,我们才能在界面上重新选择通信端口、设置各种通信参数等。否则,会显示提示错误的提示信息。同时,也可以通过MSFlexGrid控件,实现在界面上直接输入数据加上格式后发送出去。

当通信结束,即可点击“退出”按钮退出整个通信界面,完成串行通信工作。

4、 结果分析及存在的问题

如果是两台微机之间进行串行通信,则要把两台微机的串口连接起来;当然,也可在一台微机上模拟串行通信,这时应把该微机的两个串口连接起来。

在Windows下,要实现PC机之间基于C/S模式下的串行通信,既可用灵活的API函数,也可用现成的通信控件。

在很多工业控制系统中,常通过扩展串口连接多个外设,各外设发送数据的重复频率不同,要求后台实时无差错捕捉,采集,处理,记录各端口数据,这就需要在自定义的串行通信类中创建端口监视线程,以便在指定的事件发生时向相关的窗口发送通知消息。 

在C/S模式下进行串行通信,协调服务器(上位机)与若干个客户端(下位机)之间的工作,是串行通信程序实现的难点,多线程的出现可以使得各端口独立,准确地实现串行通信,使串口通信具有更广泛的灵活性与严格性,且充分利用了CPU时间,较好地协调了服务器(上位机)与若干个客户端(下位机)之间的工作

5、 主要代码

由于篇幅限制,我在本文中只写了发送事件代码(其余事件代码可参考发送事件代码的思路,另外,本过程中出现了一些在本过程中没定义的变量,它们是通用变量)

Private Sub cmdsend_Click()

 If flag = False Then   'flag用来控制在发送前,应先清空发送区

     MsgBox "请先清空发送区,然后再输入数据,51,注意!"

     Exit Sub

 End If

 cmdquery_Click   '调用查询,获取附加信息格式

 flag = False

 Dim b_array(40) As Byte

 Dim int1, int2, int_temp As Integer

 Dim checksum As Integer

 Dim i, j, k As Integer

 For i = 0 To 5

  b_array(i) = query_array(i)    'query_array用于存放查询时的字节值

 Next i

 For j = 1 To max_row

   b_array(i + j - 1) = send_array(j)    'send_array用于存放msflexgrid中直接输入的数据

 Next j

 For k = i To UBound(query_array) - 4

   b_array(j + k - 1) = query_array(k)

 Next k

 int_temp = max_row + UBound(query_array) - 4

 For i = 4 To int_temp

   checksum = checksum + b_array(i)    'CheckSum是一种编码方法

   checksum = checksum Mod 255

 Next i

 b_array(int_temp + 1) = CByte(checksum)

 int_temp = int_temp + 1

 For i = 1 To 3

    b_array(int_temp + i) = CByte(&HAA)

 Next i

 int_temp = int_temp + 3

 For i = 0 To int_temp

   msflg_send.TextMatrix(i + 1, 0) = CStr(i)

   If Len(msflg_send.TextMatrix(i + 1, 0)) = 1 Then

      msflg_send.TextMatrix(i + 1, 0) = "0" & msflg_send.TextMatrix(i + 1, 0)

      '当编号长度为1,则在编号前加0,例如:5    05

   End If

   msflg_send.TextMatrix(i + 1, 1) = CStr(Hex(b_array(i))) & "H"

   If Len(msflg_send.TextMatrix(i + 1, 1)) = 2 Then

      msflg_send.TextMatrix(i + 1, 1) = "0" & msflg_send.TextMatrix(i + 1, 1)

      '当字节值长度为2,则在字节值前加0,例如:5H    05H

   End If

 Next i

 For i = 0 To int_temp

   send_array(i) = b_array(i)

 Next i

 MSComm1.OutBufferCount = 0

MSComm1.Output = send_array

 Do

  DoEvents

   Loop Until MSComm1.OutBufferCount = 0

End Sub

    

1  范逸之,陈立元编著 《Visual BasicRS-232串行通信控制》, 中国青年出版社

2  李玉东,李雷 《Visual Basic控件大全》,.电子工业出版社

·上一篇文章:无线小区话务分析实时监测系统
·下一篇文章:扩频通信技术及其应用

复制本文地址发送给您的QQ好友:

最新更新

热门论文