串行比并行传输数据更高效,是当今最主要的传输方式。仅存的并行接口正逐渐被串行方式取代,打印机并口由USB取代,硬盘的IDE被串行的SATA取代,并行的PCI不能用于高速板卡(如日益强大的显卡),结果出现了PCI Express。所谓并行/串行,是指传输一节数据时,数据位是同时传输(并行)还是一个挨一个bit(串行)送出去。咋一看,似乎并行应该比串行快上N倍才对,为什么会被串行取代呢? 因为并行需要更多的数据线,这样就会有好多问题,例如(串扰), 还有长距离传输每个bit之间的时序难以保证,为了可靠性,只能牺牲速度。
UART(Universal Asynchronous Receiver/Transmitter)
在介绍串口之前我们先来看看UART。我们知道CPU的数据线是并行的,32位CPU就有32个引脚。并且CPU处理数据是按字为单位,而不是bit为单位,于是需要把串行收到的数据位变成字/字节,并且收发之间的时序要同步。从串行到并行的转换可以由CPU指令完成,例如在单片机上运行程序1。更常用的方式是用芯片完成,就是所谓的UART控制器,现在几乎所有单片机都集成了该模块。UART的主要功能包括:时钟发生器用来控制时序;移位寄存器用来串并转换;收发Buffer(可选)。UART不仅用于RS-232, 还包括IrDA等接口。
/* 程序1 串并行转换. 摘自wikipedia 词条:Bit-banging */
const unsigned char bitMask8[] = { 0x80, // binary 10000000 0x40, // binary 01000000 0x20, // binary 00100000 0x10, // binary 00010000 0x08, // binary 00001000 0x04, // binary 00000100 0x02, // binary 00000010 0x01 // binary 00000001 }; // This will send data in bit7~0, updating the clock each bit void send_8bit_serial_data(unsigned char data) { unsigned char x; output_high(SD_CS); // lets select the device
// Loop through all the bits, 7...0 for(x = 0; x < 8; x++) { if(data & bitMask8[x]) { output_high(SD_DI); // we have a bit, make high } else { output_low(SD_DI); // 输出低电平
} output_low(SD_CLK); // update clock output_high(SD_CLK); // update clock } output_low(SD_CS); // lets DE-select the device }
|
串口参数
言归正传,我们开始谈谈串口。凡是通信,双方必须预先协定一些参数才能完成正确的收发,串口通信中有几个参数需要协定:
1. Baud rate. 波特率是通信的比特速度(时钟),单位是bit per second
2. 数据位数. 串口通信一个帧通常5~8位为有效数据,通常是7位(ASCII 0~128)。
3. 校验位(可选). 一位作奇偶校验位
4. 起始位和停止位。停止位1,1.5, 2个位长度,通常是1bit. 慢速设备可能需要2bit的停止位.
5. 流控制。收发设备处理数据速度不等时,可能需要流控制,否则会造成数据丢失。buffer对突发数据起到一定的流控作用,对于持续不断的流数据,需要流控。流控有几种方式,一种是所谓硬件流控,串口中的RTS/CTS引脚就是收发请求信号。 还有一种成为软流控,通过发XON(ascii 17), XOFF(ascii 19)特殊字符告知发送设备暂停发送。
编程
在linux下,串口终端的设备名为ttyS*,如ttyS1,ttyS2, windows下则是COM1,COM2。虚拟串口指某些特定设备驱动模拟传统串口的行为,例如手机与PC的连接线,通常连接器驱动用COM3, COM4等名称模拟传统串口, 编程时与普通串口无异。关于串口编程,在此就不展开说了。
更多信息参考:
en.Wikipedia.org: 词条RS-232, Serial port, UART
阅读(1156) | 评论(0) | 转发(0) |