1. 程式人生 > >VC++USB及串列埠通訊程式(附工程)

VC++USB及串列埠通訊程式(附工程)

 ResetEvent(USBReadOverlapped.hEvent);
 bResult = ReadFile(HidHandle, USBRxBuff, dwBytesRead, &dwBytesRead, &USBReadOverlapped);
 if (!bResult)
 {
  if (ERROR_IO_PENDING == GetLastError()) //函式返回ERROR_IO_PENDING,表明USB正在進行讀操作
  {
   WaitForSingleObject(USBReadOverlapped.hEvent, 2000); //使用WaitForSingleObject函式等待,直到讀操作完成或延時已達到2秒鐘.當USB讀操作進行完畢後,USBReadOverlapped的hEvent事件會變為有訊號
  }
  else
  {
   ResetEvent(USBReadOverlapped.hEvent);
   AfxMessageBox(_T("USB接收資料失敗!"));
   return FALSE;
  }
 }
 if((USBRxBuff[1] = 0xAA) && (USBRxBuff[2] = 0x55) && (USBRxBuff[8+USBRxBuff[3]] == 0x0D) && (USBRxBuff[8+USBRxBuff[3]+1] == 0x0A)) //判斷幀頭幀尾
 {
  switch(USBRxBuff[5])
  {
   //Debug使用
   case 0xA0:
    if((USBRxBuff[8] == 'D') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'b') && (USBRxBuff[11] == 'u') && (USBRxBuff[12] == 'g') && (USBRxBuff[13] == ' ') \
     && (USBRxBuff[14] == 'M') && (USBRxBuff[15] == 'o') && (USBRxBuff[16] == 'd') && (USBRxBuff[17] == 'e'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n除錯模式");
    }
    else if((USBRxBuff[8] == 'N') && (USBRxBuff[9] == 'o') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'm') && (USBRxBuff[12] == 'a') && (USBRxBuff[13] == 'l') && (USBRxBuff[14] == ' ') \
     && (USBRxBuff[15] == 'M') && (USBRxBuff[16] == 'o') && (USBRxBuff[17] == 'd') && (USBRxBuff[18] == 'e'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n正常模式");
    }
    else if((USBRxBuff[8] == 'U') && (USBRxBuff[9] == 'p') && (USBRxBuff[10] == 'd') && (USBRxBuff[11] == 'a') && (USBRxBuff[12] == 't') && (USBRxBuff[13] == 'e') && (USBRxBuff[14] == ' ') \
     && (USBRxBuff[15] == 'M') && (USBRxBuff[16] == 'o') && (USBRxBuff[17] == 'd') && (USBRxBuff[18] == 'e'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n升級模式");
    }
    else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n下位機返回Error");
    }
    else
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n其他錯誤");
    }
    break;
   //獲取版本資訊類
   case 0xC0:
    if((USBRxBuff[8] == 'V') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'i') && (USBRxBuff[13] == 'o') && (USBRxBuff[14] == 'n') && (USBRxBuff[15] == '_') \
     && (USBRxBuff[16] == 'H') && (USBRxBuff[17] == 'a') && (USBRxBuff[18] == 'r') && (USBRxBuff[19] == 'd') && (USBRxBuff[20] == 'w') && (USBRxBuff[21] == 'a') && (USBRxBuff[22] == 'r') && (USBRxBuff[23] == 'e') \
     && (USBRxBuff[24] == '_') && (USBRxBuff[25] == 'V'))
    {
     bResult = TRUE;
     tmpstr.Format(_T("%c%c"), USBRxBuff[26],USBRxBuff[27]);
     InfoMsg = _T("\r\n硬體板卡版本號: ") + tmpstr;
    }
    else if((USBRxBuff[8] == 'V') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'i') && (USBRxBuff[13] == 'o') && (USBRxBuff[14] == 'n') && (USBRxBuff[15] == '_') \
     && (USBRxBuff[16] == 'S') && (USBRxBuff[17] == 'o') && (USBRxBuff[18] == 'f') && (USBRxBuff[19] == 't') && (USBRxBuff[20] == 'w') && (USBRxBuff[21] == 'a') && (USBRxBuff[22] == 'r') && (USBRxBuff[23] == 'e') \
     && (USBRxBuff[24] == '_') && (USBRxBuff[25] == 'V'))
    {
     bResult = TRUE;
     tmpstr.Format(_T("%c%c"), USBRxBuff[26],USBRxBuff[27]);
     InfoMsg = _T("\r\n韌體版本號: ") + tmpstr;
    }
    else if((USBRxBuff[8] == 'V') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'i') && (USBRxBuff[13] == 'o') && (USBRxBuff[14] == 'n') && (USBRxBuff[15] == '_') \
     && (USBRxBuff[16] == 'P') && (USBRxBuff[17] == 'r') && (USBRxBuff[18] == 'o') && (USBRxBuff[19] == 't') && (USBRxBuff[20] == 'o') && (USBRxBuff[21] == 'c') && (USBRxBuff[22] == 'o') && (USBRxBuff[23] == 'l') \
     && (USBRxBuff[24] == '_') && (USBRxBuff[25] == 'V'))
    {
     bResult = TRUE;
     tmpstr.Format(_T("%c%c"), USBRxBuff[26],USBRxBuff[27]);
     InfoMsg = _T("\r\n通訊協議版本號: ") + tmpstr;
    }
    else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n下位機返回Error");
    }
    else
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n其他錯誤");
    }
    break;
   //測試通訊類收發類
   case 0xD0:
    if((USBRxBuff[8] == 0x00) && (USBRxBuff[9] == 0xFF) && (USBRxBuff[10] == 0xFF) && (USBRxBuff[11] == 0xFF) && (USBRxBuff[12] == 0xFF) && (USBRxBuff[13] == 0xFF) && (USBRxBuff[14] == 0xFF) && (USBRxBuff[15] == 0x00)) //EDID資料頭
    {
     bResult = TRUE;
     tmpstr.Format(_T("0x%x%x"), USBRxBuff[16], USBRxBuff[17]);
     InfoMsg = _T("\r\n廠商ID: ") + tmpstr;
     tmpstr.Format(_T("0x%x%x"), USBRxBuff[18], USBRxBuff[19]);
     InfoMsg += _T("\r\n產品ID: ") + tmpstr;
     tmpstr.Format(_T("0x%x%x%x%x"), USBRxBuff[20], USBRxBuff[21], USBRxBuff[22], USBRxBuff[23]);
     InfoMsg += _T("\r\n序列號: ") + tmpstr;
     tmpstr.Format(_T("%d"), USBRxBuff[25]+1990);
     InfoMsg += _T("\r\n製造年份: ") + tmpstr;
     tmpstr.Format(_T("%d"), USBRxBuff[24]);
     InfoMsg += _T("\r\n製造周別: ") + tmpstr;
     tmpstr.Format(_T("%c.%c"), USBRxBuff[26], USBRxBuff[27]);
     InfoMsg += _T("\r\nEDIT版本: ") + tmpstr;
    }
    else if(Read8250RegFlag == TRUE)
    {
     Read8250RegFlag = FALSE;
     bResult = TRUE;
     tmpstr.Format(_T("0x%x"), USBRxBuff[8]);
     InfoMsg = _T("\r\n8520暫存器值: ") + tmpstr;
    }
    else if((USBRxBuff[8] == 'T') && (USBRxBuff[9] == 'C') && (USBRxBuff[10] == '3') && (USBRxBuff[11] == '5') && (USBRxBuff[12] == '8') && (USBRxBuff[13] == '8') && (USBRxBuff[14] == '7') && (USBRxBuff[15] == '0') \
     && (USBRxBuff[16] == '_') && (USBRxBuff[17] == 'H') && (USBRxBuff[18] == 'D') && (USBRxBuff[19] == 'M') && (USBRxBuff[20] == 'I') && (USBRxBuff[21] == 'T') && (USBRxBuff[22] == 'i') && (USBRxBuff[23] == 'm') \
     && (USBRxBuff[24] == 'C') && (USBRxBuff[25] == 'h') && (USBRxBuff[26] == 'k') && (USBRxBuff[27] == ':') && (USBRxBuff[28] == ' '))
    {
     bResult = TRUE;
     InfoMsg = _T("TC358870_HDMITimChk: " + USBRxBuff[29] + USBRxBuff[30] + USBRxBuff[31] + USBRxBuff[32] + USBRxBuff[33] + USBRxBuff[34] + USBRxBuff[35]);
    }
    else if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
     && (USBRxBuff[15] == ':') && (USBRxBuff[16] == ' '))
    {
     bResult = TRUE;
     InfoMsg = _T("Sensor: " + USBRxBuff[17] + USBRxBuff[18] + USBRxBuff[19] + USBRxBuff[20]+ USBRxBuff[21] + USBRxBuff[22] + USBRxBuff[23] + USBRxBuff[24]+ USBRxBuff[25]);
    }
    else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n下位機返回Error");
    }
    else
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n其他錯誤");
    }
    break;
   //測試使能控制開關類
   case 0xE0:
    if((USBRxBuff[8] == 'C') && (USBRxBuff[9] == 'L') && (USBRxBuff[10] == 'S') && (USBRxBuff[11] == '_') && (USBRxBuff[12] == 'P') && (USBRxBuff[13] == 'W') && (USBRxBuff[14] == 'M') \
     && (USBRxBuff[15] == '_') && (USBRxBuff[16] == 'B') && (USBRxBuff[17] == 'a') && (USBRxBuff[18] == 'c') && (USBRxBuff[19] == 'k') && (USBRxBuff[20] == 'L') && (USBRxBuff[21] == 'i') && (USBRxBuff[22] == 'g') && (USBRxBuff[23] == 'h') && (USBRxBuff[24] == 't'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n螢幕背光-關閉背光");
    }
    else if((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'N') && (USBRxBuff[10] == '_') && (USBRxBuff[11] == 'P') && (USBRxBuff[12] == 'W') && (USBRxBuff[13] == 'M') \
     && (USBRxBuff[14] == '_') && (USBRxBuff[15] == 'B') && (USBRxBuff[16] == 'a') && (USBRxBuff[17] == 'c') && (USBRxBuff[18] == 'k') && (USBRxBuff[19] == 'L') && (USBRxBuff[20] == 'i') && (USBRxBuff[21] == 'g') && (USBRxBuff[22] == 'h') && (USBRxBuff[23] == 't'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n螢幕背光-普通亮度");
    }
    else if((USBRxBuff[8] == 'M') && (USBRxBuff[9] == 'A') && (USBRxBuff[10] == 'X') && (USBRxBuff[11] == '_') && (USBRxBuff[12] == 'P') && (USBRxBuff[13] == 'W') && (USBRxBuff[14] == 'M') \
     && (USBRxBuff[15] == '_') && (USBRxBuff[16] == 'B') && (USBRxBuff[17] == 'a') && (USBRxBuff[18] == 'c') && (USBRxBuff[19] == 'k') && (USBRxBuff[20] == 'L') && (USBRxBuff[21] == 'i') && (USBRxBuff[22] == 'g') && (USBRxBuff[23] == 'h') && (USBRxBuff[24] == 't'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n螢幕背光-最大亮度");
    }
    else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n下位機返回Error");
    }
    else
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n其他錯誤");
    }
    break;
   //設定陀螺儀等Sensor的傳輸速度
   case 0xE1:
    if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
     && (USBRxBuff[15] == '1') && (USBRxBuff[16] == '0') && (USBRxBuff[17] == '0') && (USBRxBuff[18] == '0') && (USBRxBuff[19] == 'H') && (USBRxBuff[20] == 'z'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n感測器取樣率:1000Hz");
    }
    else if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
     && (USBRxBuff[15] == '5') && (USBRxBuff[16] == '0') && (USBRxBuff[17] == '0') && (USBRxBuff[18] == 'H') && (USBRxBuff[19] == 'z'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n感測器取樣率:500Hz");
    }
    else if((USBRxBuff[8] == 'S') && (USBRxBuff[9] == 'e') && (USBRxBuff[10] == 'n') && (USBRxBuff[11] == 's') && (USBRxBuff[12] == 'o') && (USBRxBuff[13] == 'r') && (USBRxBuff[14] == ' ') \
     && (USBRxBuff[15] == '1') && (USBRxBuff[16] == '0') && (USBRxBuff[17] == '0') && (USBRxBuff[18] == 'H') && (USBRxBuff[19] == 'z'))
    {
     bResult = TRUE;
     InfoMsg = _T("\r\n感測器取樣率:100Hz");
    }
    else if ((USBRxBuff[8] == 'E') && (USBRxBuff[9] == 'r') && (USBRxBuff[10] == 'r') && (USBRxBuff[11] == 'o') && (USBRxBuff[12] == 'r'))
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n下位機返回Error");
    }
    else
    {
     bResult = FALSE;
     ErrMsg = _T("\r\n其他錯誤");
    }
    break;
   default:
    bResult = FALSE;
    ErrMsg = _T("\r\n其他錯誤: 未定義指令");
    break;
  }
 }
 else
 {
  bResult = FALSE;
  ErrMsg = _T("\r\n幀資料校驗錯誤");
 }