基于S3C2410的嵌入式圖象傳輸系統設計
截取圖象方法有兩種:直接讀取設備文件和內存影射的方法,本文采用后面一種。采用這種方法后,普通文件被映射到內存地址空間,進程可以象訪問普通文件一樣訪問內存,這樣做的一個好處是可以提高效率。做視頻截取的兩個主要函數是:
ioctl(vd->fd, VIDIOCMCAPTURE, (vd->mmap)) 若調用成功,開始一副圖象的截取。是否截取完畢留給VIDIOCSYNC來判斷。
ioctl(vd->fd, VIDIOCSYNC, frame) 若調用成功,表明一幀截取已完成??梢蚤_始做下一次截取
對于網絡發送部分,主要是linux下的socket編程,調用的主要函數有:創建套接字函數socket、端口綁定函數bind、監聽函數listen、等到連接函數accept、數據接收函數read、數據發送函數write等。這些函數的具體定義和用法具體可以查閱相關資料。需要說明的是為了能夠正確發送一幀數據,要把定義的幀的結構體設置為單字節對齊,具體方法是在結構體的定義后面加上 _attribute_((packed))。
多線程編程部分用到的主要函數有:互斥量初始化函數pthread_mutex_init、互斥量鎖定函數 pthread_mutex_lock、互斥量解鎖函數pthread_mutex_unlock、互斥量注銷函數pthread_ mutex _destroy、線程創建函數pthread _ create、線程同步函數pthread_join。此外,程序中為了能更好的實現兩個進程的同步,還需要用到信號量機制的一些內容。受篇幅所限,這些函數的具體定義和用法請參考相關資料 。
3.2 客戶機端軟件系統設計
客戶端是建立在一臺PC機上,用Visual C++ 6.0設計一個基于MFC的界面作為接收端。在接收端主要完成從網絡緩沖區內讀取數據,并保存成文件的形式,文件以接收到數據的時間為名。圖2為圖象采集時間間隔為1秒時程序執行的結果。圖象大小為320 象素。需要說明的是:服務器端發送的數據采用了單字節對齊,對應的在客戶端接收的時候也要采用單字節對齊。在WINDOWS下實現內存單字節對齊的方法是在定義的幀結構體前面加上#pragma pack (1),并在其定義之后加上#pragma pack ()。
圖2 客戶端程序執行結果(1秒種采集一次圖象)
4 結束語
本文提出了一套基于S3C2410平臺和linux系統的嵌入式圖象采集、傳輸系統的具體實現,并給出了實驗結果。實驗結果證明:系統很好的完成了圖象采集和傳輸。得到的圖象清晰。服務器可以穩定運行,不會發生斷開或退出的現象。本系統可應用于工業現場的監控,也可以與其他系統如門禁系統相結合獲得門開或關時現場的重要圖象數據。
參考文獻
[1] Alessandro Rubini著 LISOLEG譯,linux設備驅動程序開發,中國電力出版社,2002
[2] 喬曉丹張鵬,一個基于Linux操作系統的嵌入式網關的實現,微計算機信息,2005年第21卷第7-2期
[3] 朱剛 等,Linux網絡編程,科學出版社,2000.
[4] 于明儉 等,linux程序設計權威指南 機械工業出版社 2001.
[5] http://mxhaard.free.fr/embedded.html
評論