上一个帖子问题描述不明确
想写一个 简单的服务器接收到客户端发送的数据,然后通过COM口发送出去,
接受端,从COM口接收数据通过服务器转到客户端,只是进行16进制传输。
采用CSocket类编写服务器,参考:http://jingyan.baidu.com/article/676629974557c254d51b84da.html?qq-pf-to=pcqq.c2c
采用MSCOMM控件,参考:http://wenku.baidu.com/link?url=6C1yqkrn79EemrwhZq3kWlYXT3STLTPyNkBUYD_ygsJktdAg35qdzhcouBHzqEpAFJNCQCq391joBjz6kOnuQLKLln12QNUNxH544ZytAyq现在遇到了两个问题
1.发送数据16进制数据,0x00 0xAA会出现异常,0x00直接置空,0xAA变为0x3F
2.接收到COM口传回来的数据,会变成分段接受。问题1,做测试的时候,客户端发送的数据与服务器返回的数据应该一样,出现如图问题
发送1
接收1
0x00数据断了发送2
接收2
0xAA变成0x3F根据@zgl7903 说的ASCII码可视的部分 0x20~0x7F 
发现了这个问题
发送3
接收3
发送了3个0xAA,只有最后一个0xAA不见了,费解。问题2。如图
发送数据 [55 08 30 01 01 2A 64 AA]
客户端接受的数据如图
分成了两段接受
部分代码如下服务器接受客户端发送的数据转发给客户端COM口void CSocketDlg::RecvData(CServerSocket* pSocket)
{
BYTE* pData = NULL;
pData = new BYTE[1024];
memset(pData, 0, sizeof(BYTE)* 1024); CString str;
if (pSocket->Receive(pData, 1024, 0) != SOCKET_ERROR)
{ str = pData;
SendMSG(str);     // 转发数据给所有用户,包括发送数据的用户
m_mscom.put_Output(COleVariant(str)); //发送十六进制数据
}
delete pData;
pData = NULL;
}
转发给客户端的函数void CSocketDlg::SendMSG(CString str)
{
//生成协议头
char *pSend = new char[str.GetLength()];
memset(pSend, 0, str.GetLength()*sizeof(char));
if (!WChar2MByte(str.GetBuffer(0), pSend, str.GetLength()))
{
AfxMessageBox(_T("字符转换失败"));
delete pSend;
return; } POSITION nPos = m_clientList.GetHeadPosition();
while (nPos)
{
CServerSocket* pTemp = (CServerSocket*)m_clientList.GetNext(nPos);
pTemp->Send(pSend, str.GetLength());
} delete pSend;}
CSocket类接受数据的函数int CSocket::Receive(void* lpBuf, int nBufLen, int nFlags)
{
if (m_pbBlocking != NULL)
{
WSASetLastError(WSAEINPROGRESS);
return  FALSE;
}
int nResult;
while ((nResult = CAsyncSocket::Receive(lpBuf, nBufLen, nFlags)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
if (!PumpMessages(FD_READ))
return SOCKET_ERROR;
}
else
return SOCKET_ERROR;
}
return nResult;
}
MSCOMM控件接收COM口数据消息响应函数void CSocketDlg::OnCommMscomm1()
{

if(m_mscom.get_CommEvent()==2)
{
char str[1024]={0};
long k;    
CString strtemp;
VARIANT InputData=m_mscom.get_Input(); //读缓冲区
COleSafeArray fs;
fs=InputData; //VARIANT型变À量转换为COleSafeArray型变量
for(k=0;k<fs.GetOneDimSize();k++)
fs.GetElement(&k,str+k); //转换为BYTE型数组
strtemp+=str;      // 接收到编辑框里面
SendMSG(strtemp); }
}

解决方案 »

  1.   

    问题1:
    发送1&接收1:
    SendMSG(CString str), str内容中间有00,导致CString计算长度时,结尾到00之前,所以截断;如果要发送中间带00的内容,最好以byte数组的方式传参,而不是用字符串。
    发送2/3&接收2/3:
    WChar2MByte的函数的转换过程有问题吧。问题2:
    不算问题吧,有可能分段收到啊。
      

  2.   

    推荐使用portmon软件辅助调试串口通讯程序。
      

  3.   

    因为我从com口接收的数据是需要整段才能做处理,如果分段的话,数据包不对,会失败。可以有什么解决办么、、?
      

  4.   

    看来看去,我觉得楼主最主要的问题是没有确定通讯协议
    socket的通讯协议决定了服务器和客户端的发送接收、缓冲区、粘包处理这些问题
    com口的通讯协议跟设备相关