⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 +

📁 Visual C++串口通信开发入门与编程实践
💻
字号:

#define MAX_UDP_SOCKET_BUFFERS 1
char tempbuf[512];
char packetno;
#memmap xmem
#use crc16. lib
#use "dcrtcp.lib"
#define ERR_OTHER 0
#define ERR_NOTFOUND 1
#define ERR_ACCESS    2
#define ERR_NOSPACE    3
#define ERR_ILLEGAL     4
#define ERR_PORT         5
#define ERR_EXISTS        6
#define ERR_NOUSER         7
#define TEST_XMODEM
#define SOH 0x01
#define STX Ox02
#define EOT Ox04
#define ACK Ox06
#define NAK 0x15
#define CAN 0x18
#define CTRLZ Ox1A
#define DLY_1S 1000
#define MAXRETRANS 25
#define DINBUFSIZE 1023
#define DOUTBUFSIZE 255
#define DPORTSPEED 9600L
#define _outbyte serDputc
#define _inbyte xm_serDgetc
int xm_serDgetc(int msdelay);
int xm_serDgetc(int msdelay)
{
  long time: int res;
  time = MS_TIMER + msdelay;
  for (;;)
  {
    res = serDgetc();
    if (MS - IMER >= time)
      break;
    if (res !=  - 1)
      break;
  }
  return res;
}

int check(int crc, char *buf, int sz)
{
  unsigned tcrc;
  int i;
  char cks;
  if (crc)
  {
    crc = (unsigned)crc16_ccitt(buf, sz)tcrc = (buf[sz] << 8) +
      buf[sz + 1];
    if (crc == tcrc)
      return 1;
  }
  else
  {
    cks = 0;
    for (i = 0; i < sz; ++i)
    {
      cks += buf[i];
    }
    if (cks == buf[sz])
      return 1;
  }
  return 0;
}
void flushinput(void)
{
  while (_inbyte(((DLY_1S) *3); 1) >= 0)
    ;
}

struct RunTimeContext
{
  udp_Socket *m_pSocket;
  char m_pBuffer[1024];
  unsigned long m_dwTimeOut;
};

void SendErrorMsg(struct RunTimeContext *pRunTime, char type, char
  *pMsg)
{
  char buffer[1024];
  memset(buffer, 0x00, sizeof(buffer));
  buffer[0] = 0;
  buffer[1] = 5;
  buffer[2] = 0;
  buffer[3] = type;
  strcpy(buffer + 4, pMsg);
  udp_send(pRunTime->m_pSocket, buffer, strlen(pmsg) + 5);
  printf("Error message <%d>'%s'was sent  \n ", type, pMsg);
}
void SendAckMsg(struct RunTimeContext *pRunTime, int block)
{
  char buffer[1024];
  memset(buffer, 0x00, sizeof(buffer));
  buffer[0] = 0;
  buffer[1] = 4;
  buffer[2] = ((char*) &block)[1];
  buffer[3] = ((char*) &block)[0];
  udp_send(pRunTime->m_pSocket, buffer, 4);
  printf("ACK <%d> was sent\n", block);
}

int GetDataPkt(struct RunTimeContext *pRunTime, int iBlock)
{
  int iACKBlock;
  int iRetval;
  unsigned long dwStartTime;
  dwStartTime = SEC_TIMER;
  while (1)
  {
    if (SEC_TIMER > (dwStartTime + pRunTime->m_dwTimeOut))
    {
      printf("TIMEOUT on reading data packet; resending ACK.\n");
      SendAckMsg(pRunTime, iBlock - 1);
      dwStartTime = read_rtc();
    }
    tcp_tick(pRunTime->m_pSocket);
    iRetval = udp_recv(pRunTime->m_pSocket, pRunTime->m_pBuffer,
      sizeof(pRunTime->m_pBuffer));
    if (iRetval > 0)
    {
      switch (pRunTime->m_pBuffer[1])
      {
        case 3;
        {
          iACKBlock = pRunTime->m_pBuffer[3] + (256 *pRunTime
            ->m_pBuffer[2]);
          printf("Got data pkt <%d>\n", iACKBlock);
          if (iACKBlock == iBlock)
          {
            SendAckMsg(pRunTime, iBlock);
            return iRetval;
          }
        }
        break;
        case 5:
          {
            return  - 1;
          }
          break;
        default:
          {
            SendErrorMsg(pRunTime, ERR_ILLEGAL, "Expected DATA");
            return  - 1;
          }
          break;
      }
    }
  }
}
int ProcessWriteReq(struct RunTimeContext *pRunTime)
{
  int iBlock;
  int iRetval;
  SendAckMsg(pRunTime, 0);
  iBlock = 0;
  while (1)
  {
    iBlock++;
    iRetval = GetDataPkt(pRunTime, iBlock);
    if (iRetval ==  - 1)
    {
      return 1;
    }

    iRetval -= 4;
    printf("send %d block\n", iBlock);
    memcpy(tempbuf, pRunTime->m_pBuffer + 4, iRetval);
    if (iBlock == 1)
      praparetransmit(tempbuf, iRetval);
    else
    {
      xmodemTransmit(tempbuf, iRetval);
    }
    if (iRetval < 512)
    {
      printf("<--END OF RECEIVED FILE\n\n");
      return 0;
    }
  }
}
int praparetransmit(unsigned char *src, int srcsz)
{
  char xbuff[1030];
  int c, retry, crc, datasz;
  datasz = srcsz;
  crc =  - 1;
  memcpy(&xbuff[0], Src, datasz);

  while (tempbuf[datasz - 1] != 0)
  {
    for (retry = 0; retry < 16; ++retry)
    {
      if ((c = _inbyte((DLY_1S) << 1)) >= 0)
      {
        switch (c)
        {
          case 'C':
            crc = 1;
            xmodemTransmit(xbuff, datasz);
            return ;
          case NAK:
            crc = 0;
            xmodemTransmit(xbuff, datasz);
            return ;
          default:
            break;
        }
      }
    }
  }
}
int xmodemTransmit(unsigned char *src, int srcsz)
{
  char xbuff[1030];
  char ccks;
  int i, c, len, retry, bufsz, crc, trantime;
  unsigned int ccrc;
  crc =  - 1;
  len = 0;
  bufsz = 128;
  trantime = srcsz / bufsz;
  if (trantime < 4)
    trantime = trantime + 1;
  start: xbuff[0] = SOH;
  xbuff[1] = packetno;
  xbuff[2] =  - packetno;
  c = srcsz - len;
  if (c > bufsz)
    c = bufsz;
  if (c > 0)
  {
    memcpy(&xbuff[3], &src[len], c);
    if (c < bufsz)
    {
      xbuff[3+c] = CTRLZ;
      memset(&xbuff[c + 4], CTRLZ, bufsz - c - 1);
    }
  }
  if (crc)
  {
    ccrc = crc16_ccitt(&xbuff[3], bufsz);
    xbuff[bufsz + 3] = (ccrc >> 8) &OxFF;
    xbuff[bufsz + 4] = ccrc &OxFF;
  }
  else
  {
    ccks = 0;
    for (i = 3; i < bufsz + 3; ++i)
    {
      ccks += xbuff[i];
    }
    xbuff[bufsz + 3] = ccks;
  }
  for (retry = 0; retry < MAXRETRANS; ++retry)
  {
    for (i = 0; i < bufsz + 4+(crc ? 1 : 0); ++i)
    {
      _outbyte(xbuff[i]);
    }
    printf("serial receive %d packetno\n", packetno);
    memset(&tempbuf[len], 0, bufsz);
    trantime = trantime - 1;
    printf("trantime is %d \n", trantime);
    if (c < bufsz)
    {
      for (retry = 0; retry < 10; ++retry)
      {
        _outbyte(EOT);
        if ((c = _inbyte((DLY_1S) << 1)) == ACK)
          break;
      }
      flushinput();
      return (c == ACK) ? len :  - 5;
    }
    if ((c = _inbyte(DLY_1S)) >= 0 && trantime == 0)
    {
      ++packetno;
      return ;
    }
    else
    {
      switch (c)
      {
        case ACK;
        ++packetno;
        len += bufsz;
        goto start;
        default:
          break;
      }
    }
  }
}
void main()
{
  int iRetVal;
  int iSvcPort;
  udp_Socket socket;
  struct RunTimeContext runtime;
  struct RunTimeContext *pRunTime;
  char buffer[518];
  serDopen(DPORTSPEED);
  memset(tempbuf, 0, 512);
  sock_init();
  ifconfig
  (
  IF_ETHO,
  IFS_DOWN,
  IFS_IPADDR,
  aton("192.168.1.3"),
  IFS_NETMASK,
  OxFFFFFF00uL,
  IFS_ROUTER_SET,
  aton("192.168.1.1"),
  IFS_UP, IFS_END
  );
  pRunTime = &runtime;
  pRunTime->m_pSocket = &socket;
  pRunTime->m_dwTimeOut = 10L;
  iSvcPort = 69;
  if (!udp_open(pRunTime->m_pSocket, iSvcPort, 0, 0, NULL))
  {
    printf("Can not setup the tftp service udp_open!\n");
    exit(0);
  }
  while (1)
  {
    tcp_tick(pRunTime->m_pSocket);
    packetno = 1;
    iRetVal = udp_recv(pRunTime->m_pSocket, pRunTime->m_pBuffer,
      sizeof(pRunTime->m_pBuffer));
    if (iRetVal >= 2)
    {
      switch (pRunTime->m_pBuffer[1])
      {
        case 2:
          {
            printf("Write request received for file'%s' \n",
              pRunTime->m_pBuffer + 2);
            ProcessWriteReq(pRunTime);
          }
          break;
        case 4:
          {
            printf("ACK <%d> was received (error)\n", pRunTime
              ->m_pBuffer[3] + (256 *pRunTime->m_pBuffer[2]));
          }
          break;
        default:
          {
            printf("Bad opcode was received:%d\n", pRunTime
              ->m_pBuffer[1]);
            SendErrorMsg(pRunTime, ERR_ILLEGAL,
              "opcode was not RRQ or WRQ");
          }
          break;
      }
      sock_close(pRunTime->m_pSocket);
      udp_open(pRunTime->m_pSocket, iSvcPort, 0, 0, NULL);
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -