上一個帖子問題描述不明確
想寫一個 簡單的服務器接收到客戶端發送的資料,然后通過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=https://bbs.csdn.net/topics/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);
}
}
uj5u.com熱心網友回復:
問題1:發送1&接收1:
SendMSG(CString str), str內容中間有00,導致CString計算長度時,結尾到00之前,所以截斷;如果要發送中間帶00的內容,最好以byte陣列的方式傳參,而不是用字串。
發送2/3&接收2/3:
WChar2MByte的函式的轉換程序有問題吧。
問題2:
不算問題吧,有可能分段收到啊。
uj5u.com熱心網友回復:
推薦使用portmon軟體輔助除錯串口通訊程式。uj5u.com熱心網友回復:
因為我從com口接收的資料是需要整段才能做處理,如果分段的話,資料包不對,會失敗。可以有什么解決辦么、、?
uj5u.com熱心網友回復:
自己設定一個接識訓沖區并解包。uj5u.com熱心網友回復:
看來看去,我覺得樓主最主要的問題是沒有確定通訊協議socket的通訊協議決定了服務器和客戶端的發送接收、緩沖區、粘包處理這些問題
com口的通訊協議跟設備相關
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/111020.html
標籤:網絡編程
上一篇:C# DES加密解密出現亂碼
下一篇:如何實作拖拽改變控制元件大小
