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