串行端口程序设计
- 格式:doc
- 大小:142.00 KB
- 文档页数:10
课程实验报告实验名称:串行接口专业班级:学号:姓名:同组人员:指导教师:报告日期:实验二1. 实验目的 (3)2. 实验内容 (3)3. 实验原理 (3)4. 程序代码 (6)5. 实验体会 (13)实验二1.实验目的1.熟悉串行接口芯片8251的工作原理2.掌握串行通讯接收/发送程序的设计方法2.实验内容通过对8251芯片的编程,使得实验台上的串行通讯接口(RS232)以查询方式实现信息在双机上的。
具体过程如下:1. 从A电脑键盘上输入一个字符,将其通过A试验箱的8251数据口发送出去,然后通过B试验箱的8251接收该字符,最后在B电脑的屏幕上显示出来。
2.从A试验箱上输入步进电机控制信息(开关信息),通过A试验箱的8251数据口发送到B试验箱的8251数据口,在B试验箱上接收到该信息之后,再用这个信息控制B试验箱上的步进电机的启动停止、转速和旋转方向。
3.实验原理1.8251控制字说明在准备发送数据和接收数据之前必须由CPU把一组控制字装入8251。
控制字分两种:方式指令和工作指令,先装入方式指令,后装入工作指令。
另外,在发送和接收数据时,要检查8251状态字,当状态字报告“发送准备好”/“接收准备好”时,才能进行数据的发送或接收。
2.8251方式指令(端口地址2B9H)3.8251工作指令(端口地址2B9H)4.8251状态字(端口地址2B9H)5.8253控制字(283H)6.8253计数初值(283H)计数初值=时钟频率/(波特率×波特率因子)本实验:脉冲源=1MHz波特率=1200波特率因=16计数初值= 1000000/1200*16=527.程序流程框图4.程序代码Fxc.asm;************************;;*8251串行通讯(自发自收)*;;************************;data segmentio8253a equ 280h ;8253计数0端口地址io8253b equ 283h ;8253控制端口地址io8251a equ 2b8h ;8251数据端口地址io8251b equ 2b9h ;8251控制端口地址mes1 db 'you can play a key on the keybord!',0dh,0ah,24hmes2 dd mes1data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8253b ;设置8253计数器0工作方式mov al,16h ;控制字为00010110Bout dx,almov dx,io8253amov al,52 ;给8253计数器0送初值out dx,almov dx,io8251b ;初始化8251;xor al,al;mov cx,03 ;向8251控制端口送3个0;delay: call out1;loop delaymov al,40h ;向8251控制端口送40H,使其复位call out1mov al,4eh ;设置为1个停止位,8个数据位,波特率因子为16 call out1mov al,27h ;向8251送控制字允许其发送和接收call out1lds dx,mes2 ;显示提示信息mov ah,09int 21hwaiti: mov dx,io8251bin al,dxtest al,01 ;发送是否准备好jz nextmov ah,0bhint 21htest al,0ffh ;检测是否有键盘输入jz nextmov dl,0ffh ;有键盘输入,读入字符mov ah,06hint 21hcmp al,27 ;若为ESC,结束jz exitmov dx,io8251a;inc alout dx,al ;发送; mov cx,40h;s51: loop s51 ;延时next: mov dx,io8251bin al,dxtest al,02 ;检查接收是否准备好jz waiti ;没有,等待mov dx,io8251ain al,dx ;准备好,接收mov dl,almov ah,02 ;将接收到的字符显示在屏幕上int 21hjmp waitiexit: mov ah,4ch ;退出int 21hout1 proc near ;向外发送一字节的子程序out dx,al;push cx;mov cx,40h;gg: loop gg ;延时; pop cxretout1 endpcode endsend startSend .asm;************************;;*8251串行通讯(自发自收)*;;************************;data segmentio8253a equ 280h ;8253计数0端口地址io8253b equ 283h ;8253控制端口地址io8251a equ 2b8h ;8251数据端口地址io8251b equ 2b9h ;8251控制端口地址buf3 byte 0mes1 db 'you can play a key on the keybord!',0dh,0ah,24hmes2 dd mes1data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8253b ;设置8253计数器0工作方式mov al,16h ;控制字为00010110Bout dx,almov dx,io8253amov al,52 ;给8253计数器0送初值out dx,almov dx,io8251b ;初始化8251mov dx,28bh ;8255控制口初始化mov al,81h ;1000,0001out dx,al;xor al,al;mov cx,03 ;向8251控制端口送3个0;delay: call out1;loop delaymov al,40h ;向8251控制端口送40H,使其复位call out1mov al,4eh ;设置为1个停止位,8个数据位,波特率因子为16 call out1mov al,27h ;向8251送控制字允许其发送和接收call out1lds dx,mes2 ;显示提示信息mov ah,09int 21hwaiti: mov dx,io8251bin al,dxtest al,01 ;发送是否准备好jz nextmov ah,0bhint 21htest al,0ffh ;检测是否有键盘输入jz next; mov dl,0ffh ;有键盘输入,读入字符;mov ah,06h; int 21hmov dx,28ahin al,dxcmp al,27 ;若为ESC,结束jz exitmov dx,io8251a;inc alout dx,al ;发送; mov cx,40h;s51: loop s51 ;延时next: mov dx,io8251bin al,dxtest al,02 ;检查接收是否准备好jz waiti ;没有,等待mov dx,io8251ain al,dx ;准备好,接收mov dl,almov ah,02 ;将接收到的字符显示在屏幕上int 21hjmp waitiexit: mov ah,4ch ;退出int 21hout1 proc near ;向外发送一字节的子程序out dx,al;push cx;mov cx,40h;gg: loop gg ;延时; pop cxretout1 endpcode endsend start步进电机:1.K0=0,逆时针转;K0=1,顺时针转2.K1=0,慢转;K1=1,快转data segmentbuf1 db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;LED显示buf2 byte 0 ;步进电机数据buf3 byte 0 ;保存开关数据buf4 byte 0 ;保存顺转数据buf5 byte 9 ;保存反转数据buf6 byte 0 ;开关机data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov buf2,00110011b ;步进电机数据mov dx,28bh ;8255控制口初始化mov al,81h ;1000,0001out dx,al;-----------------------------逆转控制----------------R0: mov dx,28ah ;读C口in al,dxmov buf3,al ;保存C口数据test al,04 ;jnz kai ;转反转test al,01 ;测试K0=1?jnz L0 ;转反转mov al,buf4 ;走马灯开始一步顺转cmp al,9jnz S1call change9_0S1: inc al ;数据加1mov buf4,almov bx,offset buf1xlatmov dx,289h ;B口输出out dx,al ;数据完成加1mov al,buf2 ;电机开始一步逆转ror al,1 ;数据左移mov buf2,almov dx,288h ;A口输出out dx,al ;电机完成一步逆转mov al,buf3 ;回复C口数据test al,02jnz R1 ;转快转call delay_s ;否则慢转jmp R0R1: call delay_q ;快转jmp R0;------------------------------顺转控制-----------------L0: mov al,buf5 ;走马灯开始一步顺转cmp al,0jnz S2T2: test al,03 ;测试K2=1?jnz T2call change0_9S2: dec al ;数据减1mov buf5,al ;mov bx,offset buf1xlatmov dx,289h ;B口输出out dx,al ;走马灯结束一步顺转mov al,buf2 ;电机开始一步顺转rol al,1 ;数据右移mov buf2,almov dx,288h ;A口输出out dx,al ;电机结束一步顺转mov al,buf3 ;回复C口数据test al,02jnz L1 ;转快转call delay_s ;否则慢转jmp R0T3: test al,03 ;测试K2=1?jnz T3L1: call delay_q ;快转jmp R0kai: mov dx,28ah ;读C口in al,dxmov buf3,al ;保存C口数据test al,04 ;jz L0 ;转反转jmp kaiexit: mov ah,4chint 21hdelay_s proc near ;长延时mov bx,20hlp1: mov cx,0ffffhlp2: loop lp2dec bxjnz lp1retdelay_s endpdelay_q proc near ;短延时mov bx,1lp11: mov cx,0ffffhlp22: loop lp22dec bxjnz lp11retdelay_q endpchange9_0 proc nearmov buf4,-1mov al,buf4retchange9_0 endpchange0_9 proc nearmov buf5,10mov al,buf5retchange0_9 endpcode endsend start5.实验体会这次实验需要用到两种芯片8253和8251,两种芯片的作用分别是8253提供串行通讯所需的特定频率的脉冲信号,8251提供输入输出控制,所以在实验的过程中需要熟悉这两种芯片的方式字等使用规范,在仔细阅读了书本以及书本的编程实例后,基本摘掉了程序的设计方法实验过程中,出现了程序编译通过了但是不能运行的情况,后来经过检查发现是程序没有设置好的原因,要设置为编译后运行状态,否知只编译不运行,经过这次实验,知道了8253和8251两种芯片的基本用法,对课本上的知识有了更深入的理解,收获不少。
V B串口通信程序设计典型实例利用VB开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数实现。
不过,只要MSComm控件可以被选用,我们推荐选择此控件实现,因为MSComm控件的功能和API调用一样强,甚至比它还好且使用起来更加简单。
在本章提供的串口通信程序设计中,除了PC与PC串口通信外,PC与单片机、PC与智能仪表、PC与PLC、PC与GSM短信模块等串口通信任务的实现均采用MSComm控件。
6.1 PC与PC串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需3根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。
本设计通过两台PC串口3线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收。
6.1.1 PC与PC串口通信程序设计目的(1)掌握PC与PC串口通信的线路连接方法。
(2)利用MSComm控件和API函数实现PC与PC串口通信的程序设计方法。
6.1.2 PC与PC串口通信程序设计用软、硬件本设计用到的硬件和软件清单如表6-1所示。
表6-1设计用软、硬件6.1.3 PC与PC串口通信程序硬件线路图线路说明,在计算机通电前,按图6-1所示将两台PC通过串口线连接起来:计算机A 串口COM1端口的TXD与计算机B串口COM1端口的RXD相连,计算机A串口COM1端口的RXD与计算机B串口COM1端口的TXD相连,计算机A串口COM1端口的GND与计算机B串口COM1端口的GND相连。
图6-1 PC与PC串口通信线路6.1.4 设计任务利用MSComm控件和VB API函数编写程序实现PC与PC串口通信。
任务要求,两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。
1绪论1.1 USB转RS232应用价值USB自从1994年推出以来,逐渐得到了广泛的应用,现在的计算机都配备有USB 接口。
USB具有传输速度快,使用方便,支持热插拔,连接灵活,独立供电等优点,可以连接鼠标、键盘、打印机、扫描仪、摄像头、闪存盘、手机等几乎所有的外部设备。
正是由于USB的强大功能,使原来流行的RS-232接口逐渐退出了市场,现在很多新型的计算机甚至不带有串口。
但是RS-232可以做很多USB无法进行的工作;而且目前尚有很多外围设备,如打印机,Modem,传真机仍是用串口连接的,计算机如果不带串口或者串口数量少就会给使用者带来极大的不便。
所以设计出一种USB转RS232的设备是非常具有实用价值的,它可以满足某些没有串口或者串口数量少的计算机对串口通信的需求。
USB转RS232通信线可使你在串口和USB接口之间非常容易地建立可靠的连接,通过利用USB接口具有的即插即用和热插拔的功能给串口外围设备提供非常容易使用的环境。
它的设计可以轻松实现USB接口到通用串口之间的转换,为没有串口的计算机提供快速的通道,而且其传输速率高达1Mbps以上[1].1.2 现有USB转RS232专用芯片介绍随着新型的计算机的串口数量逐渐减少,用户对于USB转RS232通信线的要求也在不断的增加。
许多芯片制造商陆续推出不同功能的USB转S232专用芯片,用来满足广大用户的需求。
一下是现在市面上比较流行的几种USB转RS232专用芯片。
(1)PL2303芯片:台湾玖旺科技公司推出。
兼容USB1.1规格;通信速率最高为1.5Mbps;内含USB1.1全双工收发器;支持RS232串行接口。
(2)CJS1015芯片:深圳金鑫电子科技公司推出。
兼容USB 2.0规格;使用USB 全速通信(12Mbps);内含USB 2.0全双工收发器,48MHz晶振。
(3)FT232BM芯片:FTDI公司推出。
同时兼容USB 2.0和USB 1.1规格;适合任意波特率的数据传输;内置EEPROM,可在线编程。
RS232与RS485串行接口转换电路及编程实现RS232和RS485都是串行通信接口,但它们在信号电平、传输距离和通信方式等方面有所不同。
RS232是一种单向通信的接口,常用于连接个人计算机和外部设备,如打印机、调制解调器等,信号电平为正负12V。
而RS485是一种半双工通信的接口,常用于远距离和多点通信,信号电平为正负2-6V。
为了实现RS232与RS485之间的转换,我们需要使用特定的电路和编程实现。
电路设计:1.信号电平转换:由于RS232和RS485的信号电平不同,所以我们需要使用电平转换电路将RS232的正负12V转换为RS485的正负2-6V。
这可以通过使用MAX202芯片来实现。
MAX202芯片是一个双向转换器,可以将RS232信号转换为RS485信号。
2.数据方向控制:RS485是一种半双工通信接口,需要通过数据方向控制线来实现发送和接收的切换。
可以使用一个双四极开关(如74HC4053)来控制数据方向。
其中A路和B路分别连接到RS485的A线和B线上,控制端连接到MCU的IO口。
3.电源供电:RS485通信线需要提供独立的5V供电,可以使用一个稳压芯片(如LM7805)来为RS485提供稳定的电源。
编程实现:1.初始化串口:在MCU上初始化串口,设置波特率、数据位、停止位等参数。
根据不同的MCU,具体的初始化方法会有所不同。
2.设置数据方向:根据发送或接收操作,通过控制IO口的电平来控制数据方向,将数据发送到RS485或从RS485接收数据。
3.发送数据:将要发送的数据写入串口缓冲区,并发送出去。
4.接收数据:通过轮询串口缓冲区检查是否有数据到达,若有数据则读取并进行相关处理。
总结:通过以上电路设计和编程实现,我们可以实现RS232与RS485之间的串行接口转换。
这样可以实现单向通信接口与远距离多点通信接口之间的互联。
在实际应用中,我们需要根据具体的系统需求和MCU的特性进行具体的电路和编程设计。
目录1 引言 (1)1.1 单片机与PC机串行通信研究背景 (1)1.2 单片机与PC机串行通信研究目的和意义 (1)2 串口通信基础 (1)2.1 两种常用接口方式 (2)2.1.1 并行接口 (2)2.1.2 串行接口 (2)2.2 RS-232串行接口标准 (2)3 系统总体设计 (3)3.1 系统指标设计 (3)3.1.1 通信协议设定 (3)3.1.2 系统实现描述 (3)3.2 总体方案设计 (3)4 硬件接口电路设计 (4)4.1 主要芯片 (4)4.1.1 AT89C51 (4)4.1.2 单电源转换芯片MAX232 (6)4.1.3 74LS245LED驱动芯片 (7)4.2 LED显示器 (7)4.2.1 LED显示器工作原理 (8)4.2.2 LED显示器接口 (8)4.3 系统设计 (8)5 PC机程序设计 (9)5.1 MSComm控件 (9)5.1.1 MSComm控件处理通信的方式 (9)5.1.2 MSComm控件的主要属性 (10)5.2 应用界面设计流程 (10)5.2.1 创建项目文件 (10)5.2.2 加入串口通信控件 (11)5.2.3 设计窗体界面 (12)5.3 代码实现 (12)6 仿真调试及结果分析 (15)7 结语 (17)参考文献 (18)致谢 (19)2.1 两种常用接口方式2.1.1 并行接口并行接口是指8位数据同时通过并行线进行传送,这样数据的传输率能得到极大的提高。
但在并行传输中,干扰会随线路长度的增加而增加,产生传输错误。
因此,并行传输主要应用在近距离数据传输中,如连接打印机端口。
并行接口主要使用36针接头和25针D形接头,目前以25针D形接头为主[4]。
2.1.2 串行接口串行口也是计算机的一种标准接口,PC机一般至少有两个串行口Com1和Com2。
串行口不同于并行口,它的数据和控制信息是一位接一位在一根传输线上传送的,这样串行口较并行口能够进行远距离传送信息。
PIC单⽚机在线串⾏编程(ICSP)和低电压编程(LVP)PIC单⽚机在线串⾏编程(ICSP)和低电压编程(LVP)前⾔:呵呵,不是论⽂。
刚开始研究PIC,因为想⾃⼰做个开发板。
除了如何让板⼦⼯作外,如何下程序就最关键了。
所以搜罗了些资料,经过⼀番研究,终于懂得了⼀些,拿出来分享⼀下。
有些前辈们在⽹上早就写过的资料,摘了⼀些。
特此感谢啊!副⾔:因为想做PIC16F877和16F887的板⼦,所以只对这两个做了研究,但是貌似其他的型号的PIC单⽚机的在线编程和这个⼀样!正⽂:ICSP,全称In-Circuit Serial Programming,在线串⾏编程。
这⾏英⽂和ICSP这四个字母,⼀般使⽤时都带有TM标记的,也就是说,这是MICROCHIP的商标。
也是MicroChip 独有的吧。
呵呵!ICSP分⾼电压在线串⾏编程(High-voltage In Circuit Serial Programing)和低电压在线串⾏编程(low-voltage ICSP)两种⽅法。
低电压编程和⾼电压编程只是略微有⼀些不同(详见下⽂)。
硬件连接⽅式:MicroChip的ICSP,只需要使⽤芯⽚上的5个脚就可以,其中包括VDD、VSS(GND),,然后就是VPP编程电压和输⼊的数据和时钟两个脚。
⼀般是端⼝B⼝的RB6(PGC,也叫ICSPCLK)和RB7(PGD,也叫ICSPDAT)。
若要对芯⽚的Flash和其他内存等进⾏编程,要使单⽚机⼯作到“编程/校验模式”。
编程器可以通过以下两种⽅法单⽚机⼯作到“编程/校验模式”。
第⼀种,VPP优先,时序图如下:说明:⾸先,保持和为低电平。
在此期间,先将从低电平(VIL)拉⾼到编程电压(VIHH,⼤约13V),然后将拉⾼,为芯⽚供电。
接下来,就可以通过和对芯⽚编程了。
不管芯⽚内的配置字(Configuration Word)如何配置,都可以使单⽚机⼯作到“编程校验模式”。
双机串行通讯设计实验报告实验报告:双机串行通讯设计实验一、实验目的本实验的目的是通过双机串行通讯设计,实现两台计算机之间的数据传输和通信,掌握串行通讯的基本原理和应用。
二、实验原理串行通讯是指信息逐位地按顺序传送的通信方式。
串行通讯的优点是只需一对逻辑线路即可完成数据传输,可以减少硬件成本和物理排布空间。
而并行通讯需要多对逻辑线路,更加复杂。
在本实验中,我们使用两台计算机分别作为发送端和接收端。
数据通过串行通讯线路逐位传输,接收端按照发送端发送的顺序恢复数据。
具体步骤如下:1.确定双机串行通讯的物理连接方式,例如通过串口线连接两台计算机的串行端口。
2.在发送端,将待传输的数据进行串行化处理,即将数据逐位拆分成一个个比特,按照一定的传输格式进行编码。
3.将编码后的数据按照一定的速率逐位地通过串行线路发送到接收端。
4.在接收端,根据发送端的传输格式,逐位地接收并解码数据。
5.接收端将解码后的数据进行处理,恢复为原始数据。
三、实验步骤和结果1.硬件连接:使用串口线将两台计算机的串行端口连接起来。
2.软件设置:在两台计算机上分别进行串口的设置,确定串口的参数(波特率、数据位、停止位等)一致。
3.发送端设计:编写发送端的程序,将待传输的数据进行串行化处理,并按照约定的传输格式进行编码。
4.接收端设计:编写接收端的程序,根据发送端的传输格式,逐位接收和解码数据,并进行恢复处理。
5.实验测试:分别在发送端和接收端运行程序,进行数据传输和通信测试。
通过观察接收端接收到的数据是否与发送端发送的数据一致来验证通讯是否成功。
实验结果显示,通过双机串行通讯设计,发送端的数据能够成功传输到接收端,并且接收端能够正确解码和恢复数据,实现了双机之间的数据传输和通信。
四、实验总结本实验通过双机串行通讯的设计,实现了两台计算机之间的数据传输和通信。
实验结果表明串行通讯的设计和实现是可行的。
串行通讯具有硬件成本低、占用空间少等优点,因此在实际应用中被广泛使用。
基于MPC860与ST16C654的串行通信设计按照项目设计要求处理器作为服务器,串行端口收发信息,经迅速以太网接口实时发送到局域网。
客户端将需要发送到串口的数据通过迅速以太网接口经处理器转发到串口。
因此,这是提出一种基于MPC860与ST16C654的串行通信设计计划。
采纳MPC860衔接ST16C654。
MPC860是目前在网络与通信领域应用广泛的一款微处理器,其高速的PowerPC 内核,连同集成的网络与通信外围设备,为用户提供一个建立高端通信系统的解决计划。
ST16C654是一个带有收发各64字节、可扩展4路串行通道FIF0的扩展通用异步,用于和高速调制解调器及需要迅速处理数据时光的分享网络环境一起工作。
1 系统硬件设计1.1 主要器件选型1.1.1 MPC860型微处理器MPC860 PowerQIUCC(简称MPC860)内部集成了2个处理单元。
一个处理单元是嵌入的PowerPC核(PowerPCCore),是主处理单元 (CPU),是一个RISC芯片,通常编译后的程序命令都是由它执行;另一个处理单元是通信处理模块CPM(CommunicaTIons Processor Module),内部集成有一个RISC微处理器,对各种常用的通信模块举行管理。
通信处理模块内部集成有4个串行通信控制器SCC、2个串行管理控制器 SMC、1个串行外围接口SPI和1个I2C接口。
另外,还有一个系统接口单元SIU,主要功能是提供内外的接口及一些其他功能(如SIU中断) 的管理等。
本设计利用通信处理模块CPM强大功能,与ST16C654通信。
MPC860硬件结构1所示。
1.1.2 ST16C654ST16C654是一个带有收发各64 Byte的FIF0的扩展通用异步收发器,自动软硬件流程控制,速率最高达到1.5 Mb/s(24 MHz时钟),支持16(Intel)/68(Motorola)总线接口类型。
文章编号:1009-8119(2005)04-0040-03基于WDM的USB驱动程序设计赵娟1 仲顺安1 郭磊2(1.北京理工大学信息科学技术学院,北京 1000812.石家庄陆军参谋指挥学院教育技术专业,石家庄 050064)摘要简单介绍了USB的特性。
为了介绍USB驱动,重点阐述了WDM驱动程序的原理和Windows系统内核管理机制和应用程序的区别。
并给出了利用Driverstudio的C++语言编写的例程。
关键词 USB设备,WDM,操作系统,驱动程序The Implementation of the USB Driver Based on WDMZhao Juan Zhong Shun'an Guo LeiAbstrct The attribute of the USB is descripted in the paper. For developing usb driver, the mechanism of kenerl management and the privilege level of applications in window2000 are introduced in the paper. An example of the driver handling USB transfer programmed by using C++ with the help of the driverstudio is given. Keyword USB device,WDM,OS,Driver1 引言USB,全称是Universal Serial Bus(通用串行总线),它是由Compaq、Microsoft、Intel、IBM等七家公司共同开发的,旨在解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信的标准,自1995年在Comdex上亮相以来已广泛地为各PC厂家支持。
串行端口程序设计
一、实验目的
了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I /O函数的使用。
学习使用多线程来完成串口的收发处理。
二、实验内容
读懂程序源代码,学习终端I /O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
三、预备知识
有C语言基础。
掌握在Linux下常用编辑器的使用。
掌握Makefile 的编写和使用。
掌握Linux下的程序编译与交叉编译过程
四、实验设备及工具
硬件:UP-CUP S2410 经典平台、PC机Pentium 500以上, 硬盘10G以上。
软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境
五、实验原理
异步串行I /O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图2.3.1串行通信字符格式
图2.3.1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。
至此一个字符传送完毕,线路又进入空闲,持续为“1”。
经过一段随机的时间后,下一个字符开始传送才又发出起始位。
每一个数据位的宽度等于传送波特率的倒数。
微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600等。
接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:
●奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。
●帧格式错:一个字符从起始位到停止位的总位数不对。
●溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。
每一种错误都会给出相应的出错信息,提示用户处理。
一般串口调试都使用空的MODEM 连接电缆,其连接方式如下:
图2.3.2实用RS-232C通讯连线
六、程序分析
Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在Linux中进行串行通讯编程的基本方法。
本实验的程序流程图如下:
本实验的代码如下:
下面我们对这个程序的主要部分做一下简单的分析 头文件
在Linux下串口文件位于/dev下,一般在老版本的内核中串口一为/dev/ttyS0 ,串口二为/dev/ttyS1,在我们的开发板中串口设备位于/dev/tts/下,因为开发板中没有ttyS0这个设备,所以我们要建立一个连接,方法如下:
打开串口是通过标准的文件打开函数来实现的
最基本的设置串口包括波特率设置,效验位和停止位设置。
串口的设置主要是设置 struct termios 结构体的各成员值,关于该结构体的定义可以查看
/arm2410cl/kernel/linux-2.4.18-2410cl/include/asm/termios.h文件。
设置这个结构体很复杂,可以参考man手册或者由赵克佳、沈志宇编写的《UNIX程序编写教程》,我这里就只考虑常见的一些设置:
●波特率设置:
下面是修改波特率的代码:
●校验位和停止位的设置:
无效验 8位
奇效验(Odd) 7位
偶效验(Even) 7位
●设置停止位:
1位:
2位:
设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。
●发送数据:
使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。
可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。
关闭串口就是关闭文件。
七、实验步骤
1、阅读理解源码
进入/arm2410cl/exp/basic/03_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。
2、编译应用程序
运行make产生term可执行文件
3、下载调试
切换到minicom终端窗口,使用NFS mount开发主机的/arm2410cl到/host目录。
进入
/host/exp/basic/03_tty目录,运行term,观察运行结果的正确性。
由于内核已经将串口1 作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试;这时要修改一下执行命令,在term 后要加任意参数(下面以./term www 为例)
Ctrl+c或者ESC可使程序强行退出。
注意:如果我们需要使用串口1通讯,比如做Zigbee或微型打印机实验时,需要加载串口1的驱动,这个在光盘里做了补充,请到实验补充里面找一下驱动程序s3c2410-tty.o。
insmod s3c2410-tty.o 就可以了。