客服QQ咨询: 客服QQ:7992817 客服QQ:932633
无忧论文,让您轻松写作,轻松发表,轻松晋级!联系电话:020-31801568
还在为职称而烦恼?到论文发表中心填写订单,其他的交给我们!
找不到合适的论文?可以到论文定制中心由我们帮您解忧!论文最低定制价只须800元!
| |
|
|
摘要:本文简要地叙述了基于单片机汇编语言的串行通信实现方法和基于VB6.0串行通信的实现方法,并对它们的前景进行了展望。 关键词 单片机,汇编语言, C/S模式,串行通信,MSComm 控件 一、单片机之间的全双工串行通信 1、 系统实现
设置两个标志位:(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 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 Basic的MSComm控件实现串行通信功能,其程序的实现过程如图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
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)
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)
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 Basic与RS-232串行通信控制》, 中国青年出版社 2 李玉东,李雷 《Visual Basic控件大全》,.电子工业出版社 |
| ·上一篇文章:无线小区话务分析实时监测系统 |
| ·下一篇文章:扩频通信技术及其应用 |
复制本文地址发送给您的QQ好友:
版权声明:《找临场议论文写作的“路子”》论文版权属于作者本人,您可以参考本论文进行论文创作,但不得抄袭、复制!如果您引用部分内容,请您在参考文献中标注!全部论文收录于无忧论文网免费论文库,转载本站论文资料请注明出处!