Max232产品是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片。该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA-232-F电平。该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-VTTL/CMOS电平。每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。
MAX232芯片时MAXIM公司生产的低功耗、单电源双RS232发送/接收器。适用于各种EIA-232E和V.28/V.24的通信接口。MAX232芯片内部有一个电源电压变换器,可以把输入的+5V电源变换城RS-232C输出电平所需10V电压,所以采用此芯片接口的串行通信系统只要单一的+5V电源就可以。
现选用其中一路发送/接受。T1I接S3C4510B的TXD0端,R1O接S3C4510B的RXD0端。因为MAX232具有驱动能力,所以不需要外加驱动电路。
3 软件设计
本系统采用uClinux作为操作系统。与一般全靠硬件实现的串口服务器比较起来,配置要复杂,需要用户具有一定的技术背景,不过因为带有操作系统,其灵活性也是硬件串口服务器所不能比拟的。用户可以通过编写应用程序,来随意扩展所需的功能。
uCLinux是一种优秀的嵌入式Linux版本,是micro-Conrol-Linux的缩写。它秉承了标准Linux的优良特性,经过各方面的小型化改造,形成了一个高度优化的、代码紧凑的嵌入式Linux.虽然它的体积很小,却仍然保留了Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、对各种文件系统完备的支持和标准丰富的API.它专为嵌入式系统做了许多小型化的工作,目前已支持多款CPU.其编译后目标文件可控制在几百KB数量级,并已经被成功地移植到很多平台上。具有以下优点:
(1) Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者。
(2) Linux源代码随处可见,注释丰富,文档齐全,易于解决各种问题。
(3) Linux的内核小,效率高。
(4) Linux内核的结构在网络方面是非常完整的,它提供了对包括十兆位、百兆位及千兆位的以太网络,还有无线网络,以及光纤等的支持。
(5) Linux在内核结构的设计中考虑适应系统的可裁减性的要求。可将无用的代码去除掉,近一步减少内核规模。
3.1 串口程序的设计
Linux对所有各类设备文件的输入输出擦作看上去就像对普通文件的输入输出一样。所以Linux对串口的操作,也是通过设备文件访问的。为了访问串口,只需打开相应的设备文件即可。在Linux下,默认串行口COM1和COM2对应的设备分别为/dev/ttyS0 和/dev/ttyS1.
(1) 打开串口是通过使用标准的文件打开函数操作:
int fd;
/*以读写方式打开串口*/
fd = open( "/dev/ttyS0", O_RDWR);
if (-1 == fd){
/* 不能打开串口一*/
perror(" 提示错误!");
}
(2) 设置串口
最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。
struct termio
{ unsigned short c_iflag; /* 输入模式标志 */
unsigned short c_oflag; /* 输出模式标志 */
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};
(3) 发送数据
char buffer[1024];int Length;int nByte;nByte = write(fd, buffer ,Length)
(4) 读取串口数据
使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。
char buff[1024];int Len;int readByte = read(fd,buff,Len);
3.2 网络程序的设计
Linux系统是通过提供套接字(socket)来进行网络编程的。网络程序通过socket和其它几个函数的调用,会返回一个 通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的 好处。我们可以通过向描述符读写操作实现网络之间的数据交流。以下介绍一下程序设计时常用的函数。
(1) socket
int socket(int domain, int type,int protocol)
domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等)。
type:我们网络程序所采用的通讯协议。
protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了。
(2) bind
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
sockfd:是由socket调用返回的文件描述符。
addrlen:是sockaddr结构的长度。
my_addr:是一个指向sockaddr的指针。
(3) listen
int listen(int sockfd,int backlog)
sockfd:是bind后的文件描述符。
backlog:设置请求排队的最大长度。当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度。 listen函数将bind的文件描述符变为监听套接字。返回的情况和bind一样。
(4) accept
int accept(int sockfd, struct sockaddr *addr,int *addrlen)
sockfd:是listen后的文件描述符。
(5)connect
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)。
sockfd:socket返回的文件描述符。
serv_addr:储存了服务器端的连接信息。其中sin_add是服务端的地址。
addrlen:serv_addr的长度。
connect函数是客户端用来同服务端连接的。
总的来说网络程序是由两个部分组成的--客户端和服务器端。它们的建立步骤一般是: 服务器端 socket-->bind-->listen-->accept.客户端 socket-->connect.
4 结语
经过几个月的运行,证明稳定可靠。由于ARM系列微处理器的优异性能,本系统上完全可以再加上1/2/4/8个RS-485/422/232串口,轻松连接网络并管理数量众多且分散在不同位置的串行设备。
评论
查看更多