单片机串行通信的设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机串行通信的设计

单片机性能稳固、价格低廉、功能强大,在智能仪器、工业装备以及日用电子消费品中得到了越来越广泛的应用。在单片机的输入输出操纵中,除直截了当接上小键盘和LCD显示屏等方法外,一样都通过串口和上位机PC进行通信,而后一种方法由于能实现远程操纵,同时能够利用PC机强大的数据处理功能以及友好的操纵界面,显得尤为重要。在一样的利用PC 机对单片机进行操纵的场合,差不多上采纳Windows作为上位机的平台,其优点是界面友好,编程和操作都比较容易,缺点是稳固性太差,这关于需要连续数天或数月运行的装置来讲,专门不合适。在要求比较苛刻的场合,一样都采纳UNIX工作站作为主控平台,如合肥同步辐射加速器的主控平台采纳的是SUN的Solaris工作站系统,然而UNIX工作站昂贵的价格又大大限制了其使用的范畴。近年来,随着Linux的迅猛进展,使其逐步从少数人的玩具变成了主流的操作系统。Linux是遵循GPL协议的免费源代码开放软件,任何人都能够自由的从Internet上取得其源程序,也可在GP L的协议下修改其源代码以适应特定的应用,其运行在一般的PC上,性能稳固,专门适于做工业操纵,因此实现Linux和单片机的串行通信专门有意义,他能够是昂贵的UNIX工作站的一种可选的替代方法。

1硬件原理

目前国内使用较多的为MCS-51系列的单片机,因此选用的单片机实验对象为一片AT89C51,图1是硬件原理图,由于要实现符合RS232C 的串行通信,还应该用一片ICL232CPE(MAX232)作为串行通信的电平转换电路。在实验过程中,为了查看通信是否成功,除了让单片机对上位机回送数据外,还在单片机外围扩展了几片锁存器,几个LED发光二极管和几个小键盘。串行通信是采纳最简单的TxD,RxD,GND三线制连接,注意TxD和RxD两边应该交叉连线。

上位机是一台一般的PC机,共有2个串行口COM1,COM2,其运行

RedHat8.0,实际上,如果不要求运行Gnome或KDE等图形界面,Linux 对系统硬件的要求相当低。

实验证明,此电路简单可靠,专门适用于测试串行通信。

2串行通信程序设计

串行通信程序包括下位机单片机和上位机PC机的程序。单片机接收上位机传来的数据,放到片内RAM里面,再将RAM内数据同时发送到外部扩展锁存器和上位机,由此能够判定通信是否成功。此程序由汇编语言写成,初始化时波特率设置为4 800 b/s,通信方式为8-N-1。

上位机程序的编写是关键部分,因为要对串口硬件设备进行操作,有2种方法,一是利用Linux内核自带的串口驱动程序,另外一种方法确实是直截了当读写串口硬件端口,下面分不介绍。

2.1利用串口驱动程序的编程方法

利用Linux自身的串口驱动程序进行编程,实际上确实是调用驱动程序的一系列函数,完成串口通信参数的设置,数据的发送和接收。在这种方法中,Linux给每个串口都分配一个文件索引号,有相应的文件名称,实际上是将硬件设备看成一种专门的文件,如COM1,COM2对应的文件分不为/dev/ttyS0,/dev/ttyS1,操作这2个串口实际上确实是操作这2个文件,而对硬件设备文件的操作与对一般文件的操作并没有什么不同,都能够使用相同的文件I/O调用函数(open,write,read,close),不同之处在于用系统调用open()打开串口得到相应当设备的文件描述符以后,先要对其进行初始化,设置一些特定的参数,如波特率、数据位、输入输出方式等,这些参数存放在structtermios中,函数tcsetattr()能够设置串口的structtermios,t cgetattr()能够得到串口的struct termios。设置完通信参数后就可用read和w rite对串口文件进行读写了。运行程序时要注意用户是否有对要操作的串口文件进行读写的权力,能够用chmod命令进行文件权限修改。

初始化函数如下:

初始化以后就开始发送和接收数据,先将一个字符串发送给单片机,单片机接收到数据后,将数据返回给上位机。但需要注意的是,由于上位机速度比单片机快得多,一次不能发送过多的数据,否则极有可能使发送缓冲区溢出而丢失数据,发送过后,还需等待一段时刻,使单片机将数据完全发送到上位机后,再进行读取。

2.2直截了当读写串口硬件端口的方法

在使用那个方法的时候,必须对串口通信的硬件原理有一些了解。PC 机的串口是由通用异步收发器8250UART(或16550)为核心构成的,寄存器基地址分不是0x3f8(COM1)和0x2f8(COM2),还有其他的一些用于操纵的寄存器。有专门多寄存器是与Modem有关的,而在使用三线制进行通信时用不到,只用关怀与通信有关的寄存器,比起使用为通用功能编写的串口设备驱动程序来,直截了当读写有关寄存器效率更高。

初始化后,就能够进行数据的收发了,同意数据之前必须保证接收数据就绪,这能够通过0x2fd的D0来判定,发送数据之前必须保证发送寄存器为空,这能够通过0x2fd的D5来判定,代码如下:

3结语

实验表明,此系统采纳的2种方法都完全实现了LinuxPC机与单片机之间点对点的通信,方法简单可靠,差不多上在需要用到PC机与单片机串行通信的场合均可采纳此种方法。随着近年来Linux在国内应用范畴的日益壮大,在工业操纵、数据采集等领域也必将越来越多的采纳Linux,本文能够算作是一个有益的尝试。因此在实际应用中还需要考虑一些咨询题,例如进行出错处理的咨询题,能够在一个要发送的字符串后再发送一个校验和,当收到返回的校验和与发送的校验和不一致时再进行重发,再例如所采纳的RS232C传输距离专门短,同时抗干扰能力专门差,这时需要将总线

转换成差分传输的RS485/RS422。另外,稍加改进,就可实现PC机与多片51单片机的串行通信,这时由于共用一条总线,必须给每个单片机分配一个地址,然后由PC机对总线进行仲裁,只有获得总线使用权的单片机才能与上位机进行通信,那个地点不再赘述。

总之,本文只是为Linux PC和单片机串行通信提供了一个典型的范例,要应用到实际的项目中去,还需要按照实际的情形具体考虑,灵活应用,最终才能形成一个可靠的基于Linux平台的系统。

相关文档
最新文档