当前工作是为设备上位机做TCP通信,所以只需要写客户端程序,环境是Qt5.12 MinGW,用QTcpSocket类。以下是基本的开关读写遇到的沟沟坎坎。
开关代码:
myClass()
{
QHostAddress ip;
quint16 port;
ip = QHoseAddress("192.168.10.76"); //服务器IP
port = 8800; //用服务器开放的端口号去连接服务器。
}
/***************************开**************************/
int myClass::Open()
{
m_tcpClient->connectToHost(ip,port); //用目标服务器IP/port执行连接动作
if(m_tcpClient->waitForConnected()) //等待连接返回
{
return 0;
}
return -3;
}
/***************************关**************************/
int myClass::Close()
{
m_tcpClient->disconnectFromHost();
if(m_tcpClient->state() == QAbstractSocket::UnconnectedState
|| m_tcpClient->waitForDisconnected()) //多了个条件
{
return 0;
}
return -3;
}
读:
/***************************读**************************/
//读我目前实现两种
//1、这是我最先实现的 定义信号和槽,qiodevice.h中的readyRead()信号触发槽函数进行读取数据。
myClass()
{
connect(tcpClient,SIGNAL(readyRead()),this,SLOT(ReadData()));
//头文件要声明SLOT,这里不写了
//出现connect报错:"use of undeclared identifier 'connect'"
//解决方案:增加基类public QObject
//我的是这样写class tcpComm:public ibasecomm,public QObject
}
void myClass::ReadData()
{
//当有数据进来,槽函数激活,没有过多测试激活时机等等,这种不是我需要的。
}
//2、由上层调用我的读写函数,利用waitForReadyRead()函数阻塞进程,等待数据,函数默认参数为等待时长=30000ms,超时返回false
int myClass::read(void * buffer, int len)
{
//尝试在waitForReadyRead()函数之前有数据过来,当执行wait函数时,会直接返回true。
//在阻塞期间来数据,会返回true。
//阻塞默认参数30000ms,超时返回false。
if(m__tcpClient->waitForReadyRead())
{
buffer = (void*)m_bRead.data_ptr();
return m_bRead.size();
}
}
//代码功能不完整,主要是实现读取数据功能。
/***************************写**************************/
int myClass::Write(const void * buffer, int len)
{
const char * data = (char *)buffer;
qint64 nRes = m_tcpClient->write(data,len);
return (int)nRes;
}