TCP数据读写

都是常规操作,但有一点需要注意,接收数据函数,在接收少量数据时没有问题,但在接收较大数据量(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;

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
LabVIEW是一款流行的视觉化编程软件,在工业现场中被广泛应用。Modbus TCP是控制领域中经典的通信协议,通过以太网进行数据传输。在许多工业应用中,需要将LabVIEW与Modbus TCP协议进行集成。 首先需要了解Modbus协议的运行方式,Modbus是一种基于客户端/服务器结构的协议,服务器(也称为从站)从客户端(也称为主站)上获取数据。具体来说,客户端向从站的寄存器传输一定数量的数据,从站将数据存储并返回传输确认。因此,在将LabVIEW与Modbus TCP通信时,需要编写客户端/服务器程序。 在LabVIEW中,可以使用Modbus库实现Modbus TCP通信。程序需要首先通过TCP连接到Modbus设备,随后通过读和写指令来读取和写入数据。读指令中需要指定寄存器地址和要读取的字节数。写指令中需要指定寄存器地址、数据类型和要写入的值。读写指令都需要指定通信地址和数据寄存器类型。 需要注意的是,Modbus通信需要按照特定的通信规范进行。例如,在读写指令中需要对数据进行字节顺序转换,以确保通信过程中数据的正确传输。此外,还需要确保数据类型的匹配,如32位的整数需要按照正确的字节顺序进行传输和存储。 总之,LabVIEW与Modbus TCP通信需要编写客户端/服务器程序,并按照规范进行数据传输、字节顺序转换等操作。掌握这些技能后,可以在工业现场中使用LabVIEW实现Modbus通信,实现数据读取和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值