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串口,輕松連接網絡并管理數量眾多且分散在不同位置的串行設備。
評論
查看更多