都是常规操作,但有一点需要注意,接收数据函数,在接收少量数据时没有问题,但在接收较大数据量(32KB),需要延迟一定时间(50ms),否则数据无法读完整,只能读到前面一部分,这个BUG不容易被发现,需要留意。
1 TCP请求函数
char serverIPaddress[20]="192.168.1.172"; //数据采集端IP地址
int TCPConnectStatus=0; //TCP连接状态,1代表连接,0代表无连接
unsigned int conversationHandle; //TCP连接句柄
int volatile threadDataAquireStartflag = 0; //线程开始标记,值为1时开始多线程
int volatile serverAnswer= 0; //处理完毕
//数据采集线程回调函数
int CVICALLBACK ThreadDataAquireFunction(void *functionData)
{
while(threadDataAquireStartflag == 1)
{
serverAnswer=0;
//发送请求
ClientTCPWrite(conversationHandle, http_request,sizeof(http_request), 0);
//等待响应完成
while(serverAnswer==0)
Sleep(10);
}
return 1;
}
2 TCP接收处理函数
//==============================================================================
int TCPClientCB(unsigned int handle,int xType,int errCode,void *callbackData)
{
switch(xType)
{
case TCP_DISCONNECT: //此情况处理外部因素导致的断开连接
TCPConnectStatus=0; //设置TCP连接状态为无
SetTCPDisconnectMode (conversationHandle, TCP_DISCONNECT_AUTO); //默认也是自动关闭
SetCtrlAttribute (panelHandle, PANEL_btBeginServer, ATTR_DIMMED, 0); //连接按钮enable
threadDataAquireStartflag=0; //停止线程
serverAnswer=1; //响应完成
MessagePopup("提醒","网络连接断开");
break;
case TCP_DATAREADY:
//等待50毫秒,不然数据读不全
Sleep(50);
ClientTCPRead(conversationHandle, receiveFrameData, receiveCount, 1000); //接收数据
//getRealtimeStripData(); //实时曲线图
//数据处理------------------------------------------------------
if(receiveFrameData[0] == '#')
{
int num = receiveFrameData[1] - '0';
int tp = receiveFrameData[num + 2];
receiveFrameData[num + 2] =(char)tp;
getDataParameter(&receiveFrameData[num+2+1024], sineDataCount*2);
sineDisplay();
//数据处理完毕后才能写入
writeDataToFile(sineData,sineDataCount);
}
//数据处理完毕--------------------------------------------------
serverAnswer=1;
break;
}
return 0;
}
int CVICALLBACK connectTCP (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int portnumber=8866; //端口号
int status;
switch (event)
{
case EVENT_COMMIT:
status = ConnectToTCPServer (&conversationHandle, portnumber, serverIPaddress, TCPClientCB, 0, 0);
if(status==0) //连接成功
{
SetCtrlVal (panelHandle, PANEL_PATH, "");
TCPConnectStatus=1; //设置TCP连接状态
SetCtrlAttribute (panelHandle, PANEL_btBeginServer, ATTR_DIMMED, 1); //连接按钮变灰
//启动线程函数
threadDataAquireStartflag = 1;
dataAquireCount=0;
CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE,ThreadDataAquireFunction,threadfunctiondata, &threadDataAquireID);
}
else //连接失败
{
threadDataAquireStartflag = 0;
MessagePopup ("TCP连接", "连接失败!");
SetCtrlAttribute (panelHandle, PANEL_btBeginServer, ATTR_DIMMED, 0); //连接按钮enable
}
break;
}
return 0;
}
int CVICALLBACK stopTCP (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
TCPConnectStatus=0; //设置TCP连接状态
DisconnectFromTCPServer(conversationHandle);
threadDataAquireStartflag = 0;
SetCtrlAttribute (panelHandle, PANEL_btBeginServer, ATTR_DIMMED,0); //连接按钮变灰*
break;
}
return 0;
}
注意:1、 读取全部数据
TCP_DATAREADY:
//等待50毫秒,不然数据读不全
Sleep(50);
2、请求与处理完整的切换
//数据处理完毕--------------------------------------------------
serverAnswer=1;