3,248
社区成员




BOOL CMyCommDoc::SendByXmodem(LPCTSTR lpszData, const int nLength, const int nRetryTimes)
{
char szPacket[XMODEM_BLOCK_HEAD_SIZE + XMODEM_BLOCK_NO_SIZE +
XMODEM_BLOCK_BODY_SIZE + XMODEM_BLOCK_CHK_SIZE];
char szRecvBuff[128];
char cPartNo = 0;
char cChkSum = 0;
int nRetry = 0;
int nTemp1, nTemp2;
// Notify Destination of Data Transfer
sprintf(szPacket, "%c", XMODEM_STA);
m_Comm.SendData(szPacket, 1);
Sleep(100);
if (m_Comm.RecvData(szRecvBuff, sizeof(szRecvBuff)) && szRecvBuff[0] == XMODEM_NAK)
{
// Send Data
for (nTemp1 = 0; nTemp1 < nLength; nTemp1 += XMODEM_BLOCK_BODY_SIZE)
{
//1.Make One Packet
memset(szPacket, NULL, sizeof(szPacket));
if (cPartNo == 0xFF)
cPartNo = 0;
else
cPartNo++;
cChkSum = 0;
szPacket[0] = XMODEM_SOH;
szPacket[1] = cPartNo;
szPacket[2] = 0xFF - cPartNo;
for (nTemp2 = 0; nTemp2 < XMODEM_BLOCK_BODY_SIZE; nTemp2++)
{
if ((nTemp1 + nTemp2) < nLength)
szPacket[XMODEM_BLOCK_HEAD_SIZE + XMODEM_BLOCK_NO_SIZE + nTemp2] = *(lpszData + nTemp1 + nTemp2);
else
szPacket[XMODEM_BLOCK_HEAD_SIZE + XMODEM_BLOCK_NO_SIZE + nTemp2] = XMODEM_EOF;
cChkSum += szPacket[XMODEM_BLOCK_HEAD_SIZE + XMODEM_BLOCK_NO_SIZE + nTemp2];
}
szPacket[sizeof(szPacket) - 1] = cChkSum;
//2.Send Packet
m_Comm.SendData(szPacket, sizeof(szPacket));
while (true)
{
Sleep(10);
if (m_Comm.RecvData(szRecvBuff, sizeof(szRecvBuff)))
{
// Affirmative Answer
if (szRecvBuff[0] == XMODEM_ACK)
break;
// Negative Answer
else
if (szRecvBuff[0] == XMODEM_NAK)
{
m_Comm.SendData(szPacket, sizeof(szPacket));
nRetry++;
}
}
if (nRetry >= nRetryTimes)
{
// Cancel Transfer
sprintf(szPacket, "%c%c%c%c%c", XMODEM_CAN, XMODEM_CAN, XMODEM_CAN, XMODEM_CAN, XMODEM_CAN);
m_Comm.SendData(szPacket, 5);
return false;
}
}
} // end form
} //end if
// Transfer Done
sprintf(szPacket, "%c%c%c%c%c", XMODEM_EOT, XMODEM_EOT, XMODEM_EOT, XMODEM_EOT, XMODEM_EOT);
m_Comm.SendData(szPacket, 5);
return true;
}
SendData其实和WriteToPort(LPCTSTR string)一样,好理解,在代码中手动调用就触发了写事件.它最后还是调用WriteChar()一个一个字符的来发送.
RecvData未使用监视线程,调用时手动触发.若想了解详细的使用过程,你可以在网上下载
serialProject代码看下