時間:2007-07-25 14:49:00來源:shixiang
圖1 通信方案的結構框圖
圖2 嵌入式設備的通信流程[/align]
部分代碼示例
下面給出在兩個常見的嵌入式設備操作系統下通信的實現代碼:
主動通信方代碼
主動通信方選擇WinCE 為操作系統。WinCE 與Windows2000 都是使用WinSocket,因此編程方法基本相同。
#include "Winsock2.h"
#include "Windows.h"
WSADATA wsaData;//使用的WinSocket 版本
//使用的通信協議標志
struct protoent *ppe;
//待通信Socket 的地址
struct sockaddr_in daddr;
//讀寫數據長度
DWORD cbRead=0,cbWritten=0;
BOOL fSuccess=false;//通信標志
//通信程序
DWORD HostConnect(void)
{
//確定使用WinSocket 的版本
WSAStartup(MAKEWORD (2,2),&wsaData );
//創建一個基于TCP 的套接字
ppe=getprotobyname("tcp");
SOCKETClientSocket=socket (PF_INET,SOCK_STREAM,ppe->p_proto);
//連接一個套接字
//使用TCP 協議
daddr.sin_family=AF_INET;
//設定待連接的端口
daddr.sin_port=htons(TargetPort); daddr.sin_addr.s_addr=inet_addr
(TargetIPAddress);//設定待連接設備的IP 地址
//連接目的嵌入式設備
if(connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr)))
{closesocket(ClientSocket);}
else
{
//發送消息
......//準備發送的數據
cbWritten=send(ClientSocket,SData,strlen(SD ata)),MSG_DONTROUTE);
//接收消息
do
{
cbRead=recv(ClientSocket,RData,50,MSG_PEEK);
if(cbRead>0) {fSuccess=true;}
}while(!fSuccess);
...... //數據處理
//關閉Socket
closesocket(ClientSocket)
}
return(0);
}
被動通信方代碼
被動通信方選擇VxWorks 為操作系統。Linux 與VxWorks 都可以使用BSD Socket,因此編程方法基本相同。通信任務和實時任務的數據交換以管道方式為例。
#include "vxWorks.h"
#include "sockLib.h"
#include "inetLib.h"
#include "taskLib.h"
//本機Socket 地址
struct sockaddr_in serverAddr;
//目標通信機Socket 地址
struct sockaddr_in clientAddr;
int sFd; //監聽Socket 描述苻
int newFd; //被連接Socket 描述苻
int ix=0;//被連接的Socket 數目
//啟動管道函數
void SetupPipe(void)
{
pipeDrv();//管道驅動
//管道建立
pipeDevCreate(“\pipe\ mypipe”,20,40);
}
//主通信函數
void Server(void)
{
//使用TCP/IP 協議
serverAddr.sin_family = AF_INET;
serverAddr.sin_len = sizeof (struct sockaddr_in);
//本機提供通信的端口
serverAddr.sin_port = htons(HostPort);
serverAddr.sin_addr.s_addr = htonl (HostIP);//本機IP 地址
//創建Socket
sFd = socket (AF_INET, SOCK_STREAM, 0);
//綁定Socket
bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize);
//監聽Socket
listen (sFd, SERVER_MAX_CONNECTIONS);
//等待通信事件發生
FOREVER
{
newFd = accept (sFd, (struct sockaddr *) &clientAddr,&sockAddrSize);
sprintf (workName, "tTcpWork%d", ix++);
taskSpawn(workName, NORMAL_PRIORITY, 0,
NORMAL_STACK_SIZE,(FUNCPTR) tcpCommunicateTask, newFd,(int) 0,
0,0, 0, 0, 0, 0, 0, 0);
}
}
//已連接的通信的處理函數
void tcpCommunicateTask(int sFd,)
{
do
{
//讀取數據
ReadBytes=recv(sFd,chRequest, sizeof(chRequest),MSG_PEEK);
if(ReadBytes == 0) break;
else RSuccess=true;
GetAnswerToRequest(chRequest, chReply,&ReplyBytes);//數據處理
//返回數據
WriteBytes = send (sFd, chReply, ReplyBytes ,MSG_DONTROUTE);
if ( WriteBytes!= ReplyBytes) break;
else WSuccess=true;
}while(!(RSuccess && WSuccess));
//關閉Socket
close (sFd);
}
//處理數據函數
void GetAnswerToRequest(char * Request, char * Reply, int * ReplyBytes)
{
//打開管道(每個任務有不同的管道)
int fd=open("\pipe\mypipe", O_RDWR,0);
......//相應的數據交換
}
結語
使用這種嵌入式實時系統的跨平臺通信方案,不但可以實現嵌入式設備異平臺的互聯互通,而且給系統靈活組織帶來方便。多任務的處理方式以及通信任務的分離大大提高了系統的實時性和穩定性。作者據此方案采用泓格科技(ICP DAS)的全系列產品包括PCI 和ISA 接口工業數據采集卡和嵌入式控制系統WinCon-8000 系列等產品建立的基于嵌入式設備的遠程數據采集系統運行穩定,取得了良好的效果,當然這以泓格科技在中國提供及時、到位的服務及技術支持和質量過硬的系列產品是分不開的。
參考文獻
1 VxWorks(r) 5.4 Programmer‘s Guide. Wind River Inc, 1999.6
2 Anthony Jones. Network Programming for Microsoft Windows. Microsoft Press,1999
3 李卓桓等. Linux 網絡編程. 北京:機械工業出版社. 2000.1
4 李朝青.PC 機及單片機數據通信技術.北京:北京航空航天出版社.2000
5 原嵩,林滸.通用串行總線的原理及實現. 小型微行計算機系統.1999(5)
6 張洪潤,藍清華.單片機應用技術教程. 北京:清華大學出版社.1997標簽:
傳動網版權與免責聲明:凡本網注明[來源:傳動網]的所有文字、圖片、音視和視頻文件,版權均為傳動網(www.cdcst56.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“傳動網”,違反者本網將追究其法律責任。
本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
相關資訊
產品新聞
更多>2025-09-08
華為昇騰Atlas800iA2 910B服務器Deepsee...
2025-09-04
2025-08-06
2025-07-08
2025-06-30
2025-06-16