96SEO 2026-02-20 09:10 0
。

这也是我们协议开发比较重要的一部分#xff0c;不过我们在此把它封装程一个单独的通讯库#xff0c;毕竟…继续接上篇
《半导体Gem/Secs基本协议库的开发3》本篇我们分享的比较简单windows系统下tcp和串口通讯。
这也是我们协议开发比较重要的一部分不过我们在此把它封装程一个单独的通讯库毕竟它的作用也只是收发消息而已。
so
no_debug_releasewin32:CONFIG(release,
$${PWD}/../../../deploy/lib/Release
$${PWD}/../../../deploy/lib/Debug
$${PWD}/../../../build/$${TARGET}/obj
$${PWD}/../../../build/$${TARGET}/mocSOURCES
\tcpserverobject_win.cppHEADERS
\tcpserverobject_win.h#BEFORE_LINK_CMD_LINE
begin_to_compile_JC_Commucation!
$$quote($$BEFORE_LINK_CMD_LINE)
../../../deploy/include/$$TARGET
$$quote($$AFTER_LINK_CMD_LINE)//
{TcpServer,TcpClient,SerialPort
EthernetCommucationParam{__int32
SerialCommucationParam{uint32_t
CommucationParam{EthernetCommucationParam
setEventCallBack(OnMsgRecivedEvent
JC_CreatCommObject(CommucationType
JC_RunListenThread(ICommucation*
JC_ReleaseCommObject(ICommucation*
JC_SetEventCallBack(ICommucation*
pMsgRecivedProc,OnStateChangedEvent
pStateChangedProc,OnAsyncMsgTimeoutEvent
JC_SendAsyncMessage(ICommucation*
public:CommucationBase();virtual
setEventCallBack(OnMsgRecivedEvent
commucationbase.hCommucationBase::CommucationBase()
{}CommucationBase::~CommucationBase()
CommucationBase::CreateCommObject()
CommucationBase::ReleaseCommObject()
CommucationBase::SendSyncMessage(std::string
{JC_UNUSED(strSendBuf);JC_UNUSED(needReply);JC_UNUSED(strRecvMsg);JC_UNUSED(iTimeOut);return
CommucationBase::setEventCallBack(OnMsgRecivedEvent
{JC_UNUSED(eProc1);JC_UNUSED(eProc2);JC_UNUSED(eProc3);return;
SERIALPORTCOMMUCATIONOBJECT_H#include
public:SerialportCommucationObject(CommucationParam
setEventCallBack(OnMsgRecivedEvent
默认为EV_RXCHAR,即只要收发任意一个字符,则产生一个事件*
/n本函数提供了一些常用的串口参数设置,若需要自行设置详细的DCB参数,可使用重载函数*
本监听线程完成对串口数据的监听,并将接收到的数据打印到屏幕输出*
pParam);private:CommucationParam
msgRecivedEventProc;OnStateChangedEvent
stateChangedEventProc;OnAsyncMsgTimeoutEvent
serialportobject_win.cpp#include
SerialportCommucationObject::s_bExit
5;SerialportCommucationObject::SerialportCommucationObject(CommucationParam
m_hListenThread(INVALID_HANDLE_VALUE)
SerialportCommucationObject::CreateCommObject()
InitPort(m_param.sParam.portNo,m_param.sParam.baud,m_param.sParam.parity,m_param.sParam.databits,m_param.sParam.stopsbits);}void
SerialportCommucationObject::ReleaseCommObject()
{CloseListenTread();ClosePort();DeleteCriticalSection(m_csCommunicationSync);
SerialportCommucationObject::SendData(SOCKET
char[len]{0};memcpy(umsg,msg,len);bool
SerialportCommucationObject::run()
std::endl;return;}else{std::cout
SerialportCommucationObject::setEventCallBack(OnMsgRecivedEvent
SerialportCommucationObject::SendSyncMessage(std::string
{JC_UNUSED(strSendBuf);JC_UNUSED(iTimeOut);JC_UNUSED(needReply);JC_UNUSED(strRecvMsg);puts(SerialportCommucationObject::SendSyncMessage
SerialportCommucationObject::InitPort(UINT
INVALID_HANDLE_VALUE;m_hListenThread
INVALID_HANDLE_VALUE;InitializeCriticalSection(m_csCommunicationSync);/**
szDCBparam[50];sprintf_s(szDCBparam,
*/EnterCriticalSection(m_csCommunicationSync);/**
在此可以设置输入输出的缓冲区大小,如果不设置,则系统会设置默认值.*
自己设置缓冲区大小时,要注意设置稍大一些,避免缓冲区溢出*//*if
SetupComm(m_hComm,10,10);}*//**
CommTimeouts;CommTimeouts.ReadIntervalTimeout
0;CommTimeouts.ReadTotalTimeoutMultiplier
0;CommTimeouts.ReadTotalTimeoutConstant
0;CommTimeouts.WriteTotalTimeoutMultiplier
0;CommTimeouts.WriteTotalTimeoutConstant
*/LeaveCriticalSection(m_csCommunicationSync);return
SerialportCommucationObject::InitPort(UINT
*/EnterCriticalSection(m_csCommunicationSync);/**
*/LeaveCriticalSection(m_csCommunicationSync);return
SerialportCommucationObject::OpenListenThread()
(!SetThreadPriority(m_hListenThread,
THREAD_PRIORITY_ABOVE_NORMAL)){return
SerialportCommucationObject::CloseListenTread()
*/CloseHandle(m_hListenThread);m_hListenThread
SerialportCommucationObject::WriteData(unsigned
*/EnterCriticalSection(m_csCommunicationSync);/**
PURGE_RXABORT);LeaveCriticalSection(m_csCommunicationSync);return
*/LeaveCriticalSection(m_csCommunicationSync);return
SerialportCommucationObject::GetBytesInCOM()
在调用ReadFile和WriteFile之前,通过本函数清除以前遗留的错误标志
SerialportCommucationObject::ReadChar(char
*/EnterCriticalSection(m_csCommunicationSync);/**
PURGE_RXABORT);LeaveCriticalSection(m_csCommunicationSync);return
*/LeaveCriticalSection(m_csCommunicationSync);return
SerialportCommucationObject::openPort(UINT
*/EnterCriticalSection(m_csCommunicationSync);/**
INVALID_HANDLE_VALUE){LeaveCriticalSection(m_csCommunicationSync);return
*/LeaveCriticalSection(m_csCommunicationSync);return
SerialportCommucationObject::ClosePort()
INVALID_HANDLE_VALUE){CloseHandle(m_hComm);m_hComm
SerialportCommucationObject::ListenThread(void
reinterpret_castSerialportCommucationObject*(pParam);//
pSerialPort-GetBytesInCOM();/**
0){Sleep(SLEEP_TIME_INTERVAL);continue;}/**
public:JcTcpClientObject(CommucationParam
setEventCallBack(OnMsgRecivedEvent
initialization();private:CommucationParam
tcpclientobject_win.cpp#include
1024*10JcTcpClientObject::JcTcpClientObject(CommucationParam
JcTcpClientObject::CreateCommObject()
INVALID_SOCKET){WSACleanup();return
htons(m_param.eParam.nPort);addr.sin_addr.S_un.S_addr
inet_addr(m_param.eParam.pIP);if
INVALID_SOCKET){WSACleanup();return
JcTcpClientObject::ReleaseCommObject()
false;}closesocket(c_client);WSACleanup();
JcTcpClientObject::SendData(SOCKET
JcTcpClientObject::initialization()
CreateCommObject();if(!m_connected_status)
{if(m_asyncFlag){memset(recvBuf,0,BUFSIZE);int
QByteArray(recvBuf,iRecvsize);do{if(m_buffer.size()
static_castuint8_t(m_buffer.at(0));m_messageLength
static_castuint8_t(m_buffer.at(1));m_messageLength
static_castuint8_t(m_buffer.at(2));m_messageLength
static_castuint8_t(m_buffer.at(3));}if(m_buffer.size()
{msgRecivedEventProc(this,recvBuf,iRecvsize,(void*)c_client);m_buffer.clear();m_messageLength
0);}::Sleep(10);}closesocket(c_client);WSACleanup();});thrd.detach();
JcTcpClientObject::setEventCallBack(OnMsgRecivedEvent
JcTcpClientObject::SendSyncMessage(std::string
sizeof(timeOut));setsockopt(c_client,
sizeof(timeOut));printf(开始发送消息\n);int
strSendBuf.c_str());if(needReply){iRet
public:JcTcpServerObject(CommucationParam
setEventCallBack(OnMsgRecivedEvent
msgRecivedEventProc;OnStateChangedEvent
stateChangedEventProc;OnAsyncMsgTimeoutEvent
tcpserverobject_win.cpp#include
std;JcTcpServerObject::JcTcpServerObject(CommucationParam
}JcTcpServerObject::~JcTcpServerObject()
JcTcpServerObject::CreateCommObject()
true;setsockopt(s_server,SOL_SOCKET,SO_REUSEADDR,(const
char*)bReuseaddr,sizeof(bool));///
setsockopt(s_server,SOL_SOCKET,SO_SNDTIMEO,(char
setsockopt(s_server,SOL_SOCKET,SO_RCVTIMEO,(char
*)nNetTimeout,sizeof(int));struct
server_addr;server_addr.sin_family
htons(m_param.eParam.nPort);server_addr.sin_addr.S_un.S_addr
inet_addr(m_param.eParam.pIP);if
JcTcpServerObject::ReleaseCommObject()
false;}closesocket(s_server);WSACleanup();
JcTcpServerObject::SendData(SOCKET
JcTcpServerObject::initialization()
初始化启动套接字if(!CreateCommObject()){return;}std::cout
iTempLen;FD_ZERO(fd);FD_SET(s_server,fd);//
select(0,fdOld,NULL,NULL,/*tm*/NULL);if
(FD_ISSET(fd.fd_array[i],fdOld)){///
s_server){memset(addrAccept,0,sizeof(addrTemp));s_accept
客户端连接if(stateChangedEventProc){stateChangedEventProc(this,0,(void*)fd.fd_array[i]);}FD_SET(s_accept,fd);printf(%s:%d
server!\n,inet_ntoa(addrAccept.sin_addr),ntohs(addrAccept.sin_port));}}else
非服务器,接收数据(因为fd是读数据集)memset(szDataBuff,0,BUFSIZE);iRecvSize
recv(fd.fd_array[i],szDataBuff,BUFSIZE,0);memset(addrTemp,0,sizeof(addrTemp));iTempLen
sizeof(addrTemp);getpeername(fd.fd_array[i],(sockaddr
表示正常连接1表示断开连接if(stateChangedEventProc){stateChangedEventProc(this,1,(void*)fd.fd_array[i]);}closesocket(fd.fd_array[i]);FD_CLR(fd.fd_array[i],fd);i--;printf(Failed
errorcode:%d.\n,inet_ntoa(addrTemp.sin_addr),ntohs(addrTemp.sin_port),WSAGetLastError());continue;}if
closed!\n,inet_ntoa(addrTemp.sin_addr),ntohs(addrTemp.sin_port));///
表示正常连接1表示断开连接if(stateChangedEventProc){stateChangedEventProc(this,1,(void*)fd.fd_array[i]);}closesocket(fd.fd_array[i]);FD_CLR(fd.fd_array[i],fd);i--;}if
\n,iRecvSize,inet_ntoa(addrTemp.sin_addr),ntohs(addrTemp.sin_port));///
QByteArray(szDataBuff,iRecvSize);do{if(m_buffer.size()
static_castuint8_t(m_buffer.at(0));m_messageLength
static_castuint8_t(m_buffer.at(1));m_messageLength
static_castuint8_t(m_buffer.at(2));m_messageLength
static_castuint8_t(m_buffer.at(3));}if(m_buffer.size()
{msgRecivedEventProc(this,szDataBuff,iRecvSize,(void*)fd.fd_array[i]);m_buffer.clear();m_messageLength
JcTcpServerObject::setEventCallBack(OnMsgRecivedEvent
JcTcpServerObject::SendSyncMessage(std::string
{JC_UNUSED(strSendBuf);JC_UNUSED(needReply);JC_UNUSED(strRecvMsg);JC_UNUSED(iTimeOut);return
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback