预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编号:时间:2021年x月x日书山有路勤为径学海无涯苦作舟页码:单片机串行通信的设计单片机性能稳定、价格低廉、功能强大在智能仪器、工业装备以及日用电子消费品中得到了越来越广泛的应用。在单片机的输入输出控制中除直接接上小键盘和LCD显示屏等方法外一般都通过串口和上位机PC进行通信而后一种方法由于能实现远程控制并且能够利用PC机强大的数据处理功能以及友好的控制界面显得尤为重要。在一般的利用PC机对单片机进行控制的场合都是采用Windows作为上位机的平台其优点是界面友好编程和操作都比较容易缺点是稳定性太差这对于需要连续数天或数月运行的装置来说尤其不合适。在要求比较苛刻的场合一般都采用UNIX工作站作为主控平台如合肥同步辐射加速器的主控平台采用的是SUN的Solaris工作站系统然而UNIX工作站昂贵的价格又大大限制了其使用的范围。近年来随着Linux的迅猛发展使其逐渐从少数人的玩具变成了主流的操作系统。Linux是遵循GPL协议的免费源代码开放软件任何人都可以自由的从Internet上取得其源程序也可在GPL的协议下修改其源代码以适应特定的应用其运行在普通的PC上性能稳定特别适于做工业控制因此实现Linux和单片机的串行通信非常有意义他可以是昂贵的UNIX工作站的一种可选的替代方法。1硬件原理目前国内使用较多的为MCS-51系列的单片机因此选用的单片机实验对象为一片AT89C51图1是硬件原理图由于要实现符合RS232C的串行通信还应该用一片ICL232CPE(MAX232)作为串行通信的电平转换电路。在实验过程中为了查看通信是否成功除了让单片机对上位机回送数据外还在单片机外围扩展了几片锁存器几个LED发光二极管和几个小键盘。串行通信是采用最简单的TxDRxDGND三线制连接注意TxD和RxD两边应该交叉连线。上位机是一台普通的PC机共有2个串行口COM1COM2其运行RedHat8.0实际上如果不要求运行Gnome或KDE等图形界面Linux对系统硬件的要求相当低。实验证明此电路简单可靠非常适用于测试串行通信。2串行通信程序设计串行通信程序包括下位机单片机和上位机PC机的程序。单片机接收上位机传来的数据放到片内RAM里面再将RAM内数据同时发送到外部扩展锁存器和上位机由此可以判断通信是否成功。此程序由汇编语言写成初始化时波特率设置为4800b/s通信方式为8-N-1。上位机程序的编写是关键部分因为要对串口硬件设备进行操作有2种方法一是利用Linux内核自带的串口驱动程序另外一种方法就是直接读写串口硬件端口下面分别介绍。2.1利用串口驱动程序的编程方法利用Linux自身的串口驱动程序进行编程实际上就是调用驱动程序的一系列函数完成串口通信参数的设置数据的发送和接收。在这种方法中Linux给每个串口都分配一个文件索引号有相应的文件名称实际上是将硬件设备看成一种特殊的文件如COM1COM2对应的文件分别为/dev/ttyS0/dev/ttyS1操作这2个串口实际上就是操作这2个文件而对硬件设备文件的操作与对普通文件的操作并没有什么不同都可以使用相同的文件I/O调用函数(openwritereadclose)不同之处在于用系统调用open()打开串口得到相应设备的文件描述符以后先要对其进行初始化设置一些特定的参数如波特率、数据位、输入输出方式等这些参数存放在structtermios中函数tcsetattr()可以设置串口的structtermiostcgetattr()可以得到串口的structtermios。设置完通信参数后就可用read和write对串口文件进行读写了。运行程序时要注意用户是否有对要操作的串口文件进行读写的权力可以用chmod命令进行文件权限修改。初始化函数如下:初始化以后就开始发送和接收数据先将一个字符串发送给单片机单片机接收到数据后将数据返回给上位机。但需要注意的是由于上位机速度比单片机快得多一次不能发送过多的数据否则极有可能使发送缓冲区溢出而丢失数据发送过后还需等待一段时间使单片机将数据完全发送到上位机后再进行读取。2.2直接读写串口硬件端口的方法在使用这个方法的时候必须对串口通信的硬件原理有一些了解。PC机的串口是由通用异步收发器8250UART(或16550)为核心构成的寄存器基地址分别是0x3f8(COM1)和0x2f8(COM2)还有其他的一些用于控制的寄存器。有很多寄存器是与Modem相关的而在使用三线制进行通信时用不到只用关心与通信相关的寄存器比起使用为通用功能编写的串口设备驱动程序来直接读写相关寄存器效率更高。初始化后就可以进行数据的收发了接受数据之前必须保证接收数据就绪这可以通过0x2fd的D0来判断