串口通信與網(wǎng)絡(luò)通信的應(yīng)用研究
時(shí)間:
邢子羽1由 分享
摘要:該文通過(guò)可移動(dòng)攝像頭控制系統(tǒng),探討了以Windows與Linux平臺(tái)為基礎(chǔ)的兩個(gè)操作系統(tǒng)之間的串口通信和網(wǎng)絡(luò)通信,通過(guò)基于S3C2410的嵌入式串口通信的實(shí)現(xiàn)提出了具體可行的操作。該系統(tǒng)的硬件主體設(shè)計(jì)以三星S3C2410處理器為核心控制器件,實(shí)現(xiàn)在ARM平臺(tái)上的基本功能。
關(guān)鍵詞:嵌入式;Socket;串口通信;網(wǎng)絡(luò)通信
本文的背景是研究通過(guò)對(duì)攝像頭的遠(yuǎn)程控制從而對(duì)運(yùn)動(dòng)圖像加以采集和處理。該系統(tǒng)的音視頻編解碼部分,是基于Windows系統(tǒng)用VC進(jìn)行的開(kāi)發(fā),實(shí)現(xiàn)對(duì)圖像視頻的編解碼處理,攝像頭的遠(yuǎn)程控制系統(tǒng)主要是通過(guò)Linux系統(tǒng)設(shè)計(jì)。統(tǒng)通過(guò)串口和網(wǎng)絡(luò)進(jìn)行傳輸和控制。系統(tǒng)采用C/S模型,PC機(jī)作為client端,根據(jù)采集到的數(shù)據(jù)進(jìn)行編解碼后,發(fā)送出對(duì)攝像頭的控制命令,通過(guò)網(wǎng)絡(luò)傳輸?shù)紸RM9平臺(tái)上,ARM平臺(tái)作為server端在接收到client端發(fā)送的命令后,通過(guò)串口發(fā)送命令來(lái)控制攝像頭。
1 串口通信
1.1 Linux下串口通信基本原理
Linux系統(tǒng)將設(shè)備和文件的操作都作為對(duì)文件的處理,所以對(duì)設(shè)備的操作,內(nèi)核會(huì)返回一個(gè)文件描述符,需要將其作為參數(shù)傳給相對(duì)應(yīng)的函數(shù)。Linux中所有的設(shè)備文件都放在“/dev”目錄下,通過(guò)“ttyS+編號(hào)”命名相應(yīng)的串口資源,所以對(duì)應(yīng)路徑是“/devttyS*”。因而可以相對(duì)文件讀寫(xiě)那樣訪問(wèn)一個(gè)串口設(shè)備。
1.2 Linux下的串口設(shè)置
首先要對(duì)串口進(jìn)行設(shè)置,在termios.h完成對(duì)波特率等的設(shè)置。
struct termios
{tcflag t c iflag;
tcflag t c oflag;
tcflag t c cflag;
tcflag t c lflag;
cc t c cc [NCCS];
};
open()函數(shù):int fd = open ("/dev/ttyS *", O RDWR|O NOCTTY|O NDELA Y);
然后調(diào)用read()和write()函數(shù)讀寫(xiě)端口,返回實(shí)際讀寫(xiě)的字節(jié)數(shù),如果有錯(cuò)誤發(fā)生則返回-1。
讀取串口結(jié)束后,首先恢復(fù)串口原始屬性,然后才可以關(guān)閉串口并退出程序。
1.3 串口控制應(yīng)用程序
下面給出本系統(tǒng)中一個(gè)通過(guò)串口控制攝像頭的函數(shù)的一部分結(jié)構(gòu):
void sendMsg(int pan,int tilt)
{struct timeval timeout;
static char *driver = "/dev/ttyS1";
timeout.tv_sec = 0;
timeout.tv_usec = 0;
formCmd(buf,pan,tilt);
fd = uart_open(driver,B9600);
write(fd,buf,16);
close(fd);
}
2 網(wǎng)絡(luò)通信
2.1 Socket基本原理介紹
Socket是一種通信機(jī)制,客戶/服務(wù)器系統(tǒng)既可以在本地單機(jī)上運(yùn)行,也可以在網(wǎng)絡(luò)中運(yùn)行。
首先需要了解socket中的一些重要函數(shù):
1) 創(chuàng)建Socket:int socket( intdomain, inttype, intprotocol);
2) 配置Socket:bind函數(shù)指定本地信息int bind( intsocket, const structsockaddr* address, size_taddress_len);
3) 使用listen( )和accept( )函數(shù)獲取遠(yuǎn)端信息:
Int listen(int socket, int backlog);
Int accept(int socket, struct sockaddr* address, size_t* address_len);
4) 通信處理:send( ),write( ),recv( ),read( )。
5) 通信結(jié)束:使用closesocket( )。
2.2 Windows和Linux下socket應(yīng)用程序
客戶端程序:創(chuàng)建一個(gè)未命名的套接字,然后把它連接到服務(wù)器套接字server_socket上,向服務(wù)器寫(xiě)一個(gè)字符,再讀回經(jīng)服務(wù)器處理后的一個(gè)字符。
服務(wù)器端程序:首先創(chuàng)建一個(gè)服務(wù)器套接字,綁定到一個(gè)名字,然后創(chuàng)建一個(gè)監(jiān)聽(tīng)隊(duì)列,接收來(lái)自客戶程序的連接。
下面我們分別在Windows和Linux下進(jìn)行socket編程,實(shí)現(xiàn)二者之間的通信,具體函數(shù)實(shí)現(xiàn)的主要部分如下:
Windows下作為client端:
{
SocketClient=socket(AF_INET,SOCK_STREAM,0);
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.10");
while(1)
send(SocketClient,sendBuffer,16,0);
closesocket(SocketClient);
WSACleanup();
}
Linux下作為server端:
{
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_addr.s_addr = inet_addr("192.168.1.10");
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
while(1)
read(client_sockfd, str,16);
close(client_sockfd);
}
3 結(jié)束語(yǔ)
本文設(shè)計(jì)了基于嵌入式平臺(tái)上可移動(dòng)攝像頭遠(yuǎn)程控制,對(duì)串口通信和網(wǎng)絡(luò)通信的原理和機(jī)制加以闡述,對(duì)串口驅(qū)動(dòng)和網(wǎng)絡(luò)驅(qū)動(dòng)的編寫(xiě)提出了具體的方法,并且在實(shí)際的操作應(yīng)用中給出了具體函數(shù)的編寫(xiě)。本文所提供的處理方法已在實(shí)際的項(xiàng)目中的得到應(yīng)用,對(duì)于其他的通過(guò)串口通信和網(wǎng)絡(luò)通信控制的設(shè)備,具有參考意義,今后我們還將展開(kāi)進(jìn)一步的相關(guān)研究。
參考文獻(xiàn):
[1] 劉智國(guó),張海春.基于S3C2410的嵌入式串口通信設(shè)計(jì)[J].微計(jì)算機(jī)信息(嵌入式與SOC),2009,25(4-2).
[2] 常春國(guó),史金飛,羅翔,張磊. Windows與Linux串口通信和網(wǎng)絡(luò)通信的比較研究[J].中國(guó)制造業(yè)信息化,2006,(4):49-52.
[3] 賴曉晨.嵌入式C/C++程序設(shè)計(jì)[J].北京:清華大學(xué)出版社,2008.
關(guān)鍵詞:嵌入式;Socket;串口通信;網(wǎng)絡(luò)通信
本文的背景是研究通過(guò)對(duì)攝像頭的遠(yuǎn)程控制從而對(duì)運(yùn)動(dòng)圖像加以采集和處理。該系統(tǒng)的音視頻編解碼部分,是基于Windows系統(tǒng)用VC進(jìn)行的開(kāi)發(fā),實(shí)現(xiàn)對(duì)圖像視頻的編解碼處理,攝像頭的遠(yuǎn)程控制系統(tǒng)主要是通過(guò)Linux系統(tǒng)設(shè)計(jì)。統(tǒng)通過(guò)串口和網(wǎng)絡(luò)進(jìn)行傳輸和控制。系統(tǒng)采用C/S模型,PC機(jī)作為client端,根據(jù)采集到的數(shù)據(jù)進(jìn)行編解碼后,發(fā)送出對(duì)攝像頭的控制命令,通過(guò)網(wǎng)絡(luò)傳輸?shù)紸RM9平臺(tái)上,ARM平臺(tái)作為server端在接收到client端發(fā)送的命令后,通過(guò)串口發(fā)送命令來(lái)控制攝像頭。
1 串口通信
1.1 Linux下串口通信基本原理
Linux系統(tǒng)將設(shè)備和文件的操作都作為對(duì)文件的處理,所以對(duì)設(shè)備的操作,內(nèi)核會(huì)返回一個(gè)文件描述符,需要將其作為參數(shù)傳給相對(duì)應(yīng)的函數(shù)。Linux中所有的設(shè)備文件都放在“/dev”目錄下,通過(guò)“ttyS+編號(hào)”命名相應(yīng)的串口資源,所以對(duì)應(yīng)路徑是“/devttyS*”。因而可以相對(duì)文件讀寫(xiě)那樣訪問(wèn)一個(gè)串口設(shè)備。
1.2 Linux下的串口設(shè)置
首先要對(duì)串口進(jìn)行設(shè)置,在termios.h完成對(duì)波特率等的設(shè)置。
struct termios
{tcflag t c iflag;
tcflag t c oflag;
tcflag t c cflag;
tcflag t c lflag;
cc t c cc [NCCS];
};
open()函數(shù):int fd = open ("/dev/ttyS *", O RDWR|O NOCTTY|O NDELA Y);
然后調(diào)用read()和write()函數(shù)讀寫(xiě)端口,返回實(shí)際讀寫(xiě)的字節(jié)數(shù),如果有錯(cuò)誤發(fā)生則返回-1。
讀取串口結(jié)束后,首先恢復(fù)串口原始屬性,然后才可以關(guān)閉串口并退出程序。
1.3 串口控制應(yīng)用程序
下面給出本系統(tǒng)中一個(gè)通過(guò)串口控制攝像頭的函數(shù)的一部分結(jié)構(gòu):
void sendMsg(int pan,int tilt)
{struct timeval timeout;
static char *driver = "/dev/ttyS1";
timeout.tv_sec = 0;
timeout.tv_usec = 0;
formCmd(buf,pan,tilt);
fd = uart_open(driver,B9600);
write(fd,buf,16);
close(fd);
}
2 網(wǎng)絡(luò)通信
2.1 Socket基本原理介紹
Socket是一種通信機(jī)制,客戶/服務(wù)器系統(tǒng)既可以在本地單機(jī)上運(yùn)行,也可以在網(wǎng)絡(luò)中運(yùn)行。
首先需要了解socket中的一些重要函數(shù):
1) 創(chuàng)建Socket:int socket( intdomain, inttype, intprotocol);
2) 配置Socket:bind函數(shù)指定本地信息int bind( intsocket, const structsockaddr* address, size_taddress_len);
3) 使用listen( )和accept( )函數(shù)獲取遠(yuǎn)端信息:
Int listen(int socket, int backlog);
Int accept(int socket, struct sockaddr* address, size_t* address_len);
4) 通信處理:send( ),write( ),recv( ),read( )。
5) 通信結(jié)束:使用closesocket( )。
2.2 Windows和Linux下socket應(yīng)用程序
客戶端程序:創(chuàng)建一個(gè)未命名的套接字,然后把它連接到服務(wù)器套接字server_socket上,向服務(wù)器寫(xiě)一個(gè)字符,再讀回經(jīng)服務(wù)器處理后的一個(gè)字符。
服務(wù)器端程序:首先創(chuàng)建一個(gè)服務(wù)器套接字,綁定到一個(gè)名字,然后創(chuàng)建一個(gè)監(jiān)聽(tīng)隊(duì)列,接收來(lái)自客戶程序的連接。
下面我們分別在Windows和Linux下進(jìn)行socket編程,實(shí)現(xiàn)二者之間的通信,具體函數(shù)實(shí)現(xiàn)的主要部分如下:
Windows下作為client端:
{
SocketClient=socket(AF_INET,SOCK_STREAM,0);
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.10");
while(1)
send(SocketClient,sendBuffer,16,0);
closesocket(SocketClient);
WSACleanup();
}
Linux下作為server端:
{
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_addr.s_addr = inet_addr("192.168.1.10");
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
while(1)
read(client_sockfd, str,16);
close(client_sockfd);
}
3 結(jié)束語(yǔ)
本文設(shè)計(jì)了基于嵌入式平臺(tái)上可移動(dòng)攝像頭遠(yuǎn)程控制,對(duì)串口通信和網(wǎng)絡(luò)通信的原理和機(jī)制加以闡述,對(duì)串口驅(qū)動(dòng)和網(wǎng)絡(luò)驅(qū)動(dòng)的編寫(xiě)提出了具體的方法,并且在實(shí)際的操作應(yīng)用中給出了具體函數(shù)的編寫(xiě)。本文所提供的處理方法已在實(shí)際的項(xiàng)目中的得到應(yīng)用,對(duì)于其他的通過(guò)串口通信和網(wǎng)絡(luò)通信控制的設(shè)備,具有參考意義,今后我們還將展開(kāi)進(jìn)一步的相關(guān)研究。
參考文獻(xiàn):
[1] 劉智國(guó),張海春.基于S3C2410的嵌入式串口通信設(shè)計(jì)[J].微計(jì)算機(jī)信息(嵌入式與SOC),2009,25(4-2).
[2] 常春國(guó),史金飛,羅翔,張磊. Windows與Linux串口通信和網(wǎng)絡(luò)通信的比較研究[J].中國(guó)制造業(yè)信息化,2006,(4):49-52.
[3] 賴曉晨.嵌入式C/C++程序設(shè)計(jì)[J].北京:清華大學(xué)出版社,2008.