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