串列埠通訊與網路通訊的應用研究

  摘要:該文通過可移動攝像頭控制系統,探討了以Windows與Linux平臺為基礎的兩個作業系統之間的串列埠通訊和網路通訊,通過基於S3C2410的嵌入式串列埠通訊的實現提出了具體可行的操作。該系統的硬體主體設計以三星S3C2410處理器為核心控制器件,實現在ARM平臺上的基本功能。
  關鍵詞:嵌入式;Socket;串列埠通訊;網路通訊

  本文的背景是研究通過對攝像頭的遠端控制從而對運動影象加以採集和處理。該系統的音視訊編解碼部分,是基於Windows系統用VC進行的開發,實現對影象視訊的編解碼處理,攝像頭的遠端控制系統主要是通過Linux系統設計。統通過串列埠和網路進行傳輸和控制。系統採用C/S模型,PC機作為client端,根據採集到的資料進行編解碼後,傳送出對攝像頭的控制命令,通過網路傳輸到ARM9平臺上,ARM平臺作為server端在接收到client端傳送的命令後,通過串列埠傳送命令來控制攝像頭。
  1 串列埠通訊
  1.1 Linux下串列埠通訊基本原理
  Linux系統將裝置和檔案的操作都作為對檔案的處理,所以對裝置的操作,核心會返回一個檔案描述符,需要將其作為引數傳給相對應的函式。Linux中所有的裝置檔案都放在“/dev”目錄下,通過“ttyS+編號”命名相應的串列埠資源,所以對應路徑是“/devttyS*”。因而可以相對檔案讀寫那樣訪問一個串列埠裝置。
  1.2 Linux下的串列埠設定
  首先要對串列埠進行設定,在termios.h完成對波特率等的設定。
  struct termios
  {tcflag t c iflag;
  tcflag t c oflag;
  tcflag t c cflag;
  tcflag t c lflag;
  cc t c cc [NCCS];
  };
  open******函式:int fd = open ***"/dev/ttyS *", O RDWR|O NOCTTY|O NDELA Y***;
  然後呼叫read******和write******函式讀寫埠,返回實際讀寫的位元組數,如果有錯誤發生則返回-1。
  讀取串列埠結束後,首先恢復串列埠原始屬性,然後才可以關閉串列埠並退出程式。
  1.3 串列埠控制應用程式
  下面給出本系統中一個通過串列埠控制攝像頭的函式的一部分結構:
  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 網路通訊
  2.1 Socket基本原理介紹
  Socket是一種通訊機制,客戶/伺服器系統既可以在本地單機上執行,也可以在網路中執行。
  首先需要了解socket中的一些重要函式:
  1*** 建立 socket*** intdomain, inttype, intprotocol***;
  2*** 配置 bind*** intsocket, const structsockaddr* address, size_taddress_len***;
  3*** 使用listen*** ***和accept*** ***函式獲取遠端資訊:
  Int listen***int socket, int backlog***;
  Int accept***int socket, struct sockaddr* address, size_t* address_len***;
  4*** 通訊處理:send*** ***,write*** ***,recv*** ***,read*** ***。
  5*** 通訊結束:使用closesocket*** ***。
  2.2 Windows和Linux下socket應用程式
  客戶端程式:建立一個未命名的套接字,然後把它連線到伺服器套接字server_socket上,向伺服器寫一個字元,再讀回經伺服器處理後的一個字元。
  伺服器端程式:首先建立一個伺服器套接字,繫結到一個名字,然後建立一個監聽佇列,接收來自客戶程式的連線。
  下面我們分別在Windows和Linux下進行socket程式設計,實現二者之間的通訊,具體函式實現的主要部分如下:
  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 結束語
  本文設計了基於嵌入式平臺上可移動攝像頭遠端控制,對串列埠通訊和網路通訊的原理和機制加以闡述,對串列埠驅動和網路驅動的編寫提出了具體的方法,並且在實際的操作應用中給出了具體函式的編寫。本文所提供的處理方法已在實際的專案中的得到應用,對於其他的通過串列埠通訊和網路通訊控制的裝置,具有參考意義,今後我們還將展開進一步的相關研究。
  參考文獻:
  [1] 劉智國,張海春.基於S3C2410的嵌入式串列埠通訊設計[J].微計算機資訊***嵌入式與SOC***,2009,25***4-2***.
  [2] 常春國,史金飛,羅翔,張磊. Windows與Linux串列埠通訊和網路通訊的比較研究[J].中國製造業資訊化,2006,***4***:49-52.
  [3] 賴曉晨.嵌入式C/C++程式設計[J].北京:清華大學出版社,2008.