久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3778|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語言讀取模塊實(shí)例程序VS2010

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:114240 發(fā)表于 2016-4-15 18:24 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
========================================================================
    控制臺(tái)應(yīng)用程序:UARTTest 項(xiàng)目概述
========================================================================

應(yīng)用程序向?qū)б褳槟鷦?chuàng)建了此 UARTTest 應(yīng)用程序。

本文件概要介紹組成 UARTTest 應(yīng)用程序的每個(gè)文件的內(nèi)容。


UARTTest.vcxproj
    這是使用應(yīng)用程序向?qū)傻?VC++ 項(xiàng)目的主項(xiàng)目文件,
    其中包含生成該文件的 Visual C++
    的版本信息,以及有關(guān)使用應(yīng)用程序向?qū)нx擇的平臺(tái)、配置和項(xiàng)目功能的信息。

UARTTest.vcxproj.filters
    這是使用“應(yīng)用程序向?qū)А鄙傻?VC++ 項(xiàng)目篩選器文件。
    它包含有關(guān)項(xiàng)目文件與篩選器之間的關(guān)聯(lián)信息。 在 IDE
    中,通過這種關(guān)聯(lián),在特定節(jié)點(diǎn)下以分組形式顯示具有相似擴(kuò)展名的文件。
    例如,“.cpp”文件與“源文件”篩選器關(guān)聯(lián)。

UARTTest.cpp
    這是主應(yīng)用程序源文件。

/////////////////////////////////////////////////////////////////////////////
其他標(biāo)準(zhǔn)文件:

StdAfx.h,StdAfx.cpp
    這些文件用于生成名為 UARTTest.pch 的預(yù)編譯頭 (PCH) 文件和
    名為 StdAfx.obj 的預(yù)編譯類型文件。

/////////////////////////////////////////////////////////////////////////////
其他注釋:

應(yīng)用程序向?qū)褂谩癟ODO:”注釋來指示應(yīng)添加或自定義的源代碼部分。

/////////////////////////////////////////////////////////////////////////////


  1. #include <stdafx.h>
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <windows.h>
  5. #include "Com.h"

  6. #define                TOTAL_PORT_NUM                65
  7. #define                START_PORT_NUM                0

  8. #define                iBufferSize 250
  9. #define     UARTBufferLength 98304
  10. #undef  SYNCHRONOUS_MODE

  11. static HANDLE                 hComDev[TOTAL_PORT_NUM]         ={NULL};
  12. static unsigned long long ulComMask = 0;
  13. static HANDLE                 hCOMThread[TOTAL_PORT_NUM]      ={NULL};
  14. static OVERLAPPED         stcWriteStatus[TOTAL_PORT_NUM]  = {0};
  15. static OVERLAPPED         stcReadStatus[TOTAL_PORT_NUM]   = {0};

  16. #ifdef SYNCHRONOUS_MODE
  17. static HANDLE                 hReceiveEvent[TOTAL_PORT_NUM]   ={NULL};
  18. #endif

  19. static volatile char chrUARTBuffers[TOTAL_PORT_NUM][UARTBufferLength]={0};
  20. static volatile unsigned long ulUARTBufferStart[TOTAL_PORT_NUM]={0}, ulUARTBufferEnd[UARTBufferLength]={0};

  21. unsigned short CollectUARTData(const unsigned long ulCOMNo,char chrUARTBufferOutput[])
  22. {
  23.         unsigned long ulLength=0;
  24.         unsigned long ulEnd ;
  25.         unsigned long ulStart ;

  26. #ifdef SYNCHRONOUS_MODE
  27.         WaitForSingleObject(hReceiveEvent[ulIndexCorrect],INFINITE);
  28.         ResetEvent(hReceiveEvent[ulIndexCorrect]);
  29. #endif
  30.         ulEnd = ulUARTBufferEnd[ulCOMNo];
  31.         ulStart = ulUARTBufferStart[ulCOMNo];
  32.         if (ulEnd == ulStart)
  33.                 return(0);
  34.         if (ulEnd > ulStart)
  35.         {
  36.                 memcpy((void*)chrUARTBufferOutput,(void*)(chrUARTBuffers[ulCOMNo]+ulStart),ulEnd-ulStart);
  37.                 ulLength = ulEnd-ulStart;
  38.         }
  39.         else
  40.         {
  41.                 memcpy((void*)chrUARTBufferOutput,(void*)(chrUARTBuffers[ulCOMNo]+ulStart),UARTBufferLength-ulStart);
  42.                 if ( ulEnd != 0 )
  43.                 {
  44.                         memcpy((void*)(chrUARTBufferOutput+(UARTBufferLength-ulStart)),(void*)chrUARTBuffers[ulCOMNo],ulEnd);
  45.                 }
  46.                 ulLength = UARTBufferLength+ulEnd-ulStart;
  47.         }
  48.         ulUARTBufferStart[ulCOMNo] = ulEnd;
  49.         return (unsigned short) ulLength;
  50. }

  51. signed char SendUARTMessageLength(const unsigned long ulChannelNo, const char chrSendBuffer[],const unsigned short usLen)
  52. {
  53.         DWORD iR;
  54.         DWORD dwRes;
  55.         DCB dcb;
  56.         char chrDataToSend[1000] = {0};
  57.         memcpy(chrDataToSend,chrSendBuffer,usLen);
  58.         memcpy(&chrDataToSend[usLen],chrSendBuffer,usLen);

  59.         GetCommState(hComDev[ulChannelNo] ,&dcb);
  60.         dcb.fDtrControl = 0;//DTR = 1;發(fā)送
  61.         SetCommState(hComDev[ulChannelNo] ,&dcb);

  62.         if ( WriteFile(hComDev[ulChannelNo],chrSendBuffer,usLen,&iR,&(stcWriteStatus[ulChannelNo])) || GetLastError() != ERROR_IO_PENDING  )
  63.                 return -1;
  64.         dwRes = WaitForSingleObject(stcWriteStatus[ulChannelNo].hEvent,1000);
  65.         Sleep(10);
  66.         dcb.fDtrControl = 1;//DTR = 0;接收
  67.         SetCommState(hComDev[ulChannelNo] ,&dcb);
  68.         Sleep(10);

  69.         if(dwRes != WAIT_OBJECT_0 || ! GetOverlappedResult(hComDev[ulChannelNo], &stcWriteStatus[ulChannelNo], &iR, FALSE))
  70.                 return 0;
  71.         return 0;
  72. }

  73. DWORD WINAPI ReceiveCOMData(PVOID pParam)
  74. {
  75.         unsigned long uLen;
  76.         unsigned long ulLen1;
  77.         unsigned long ulLen2;
  78.         DWORD        dwRes;
  79.         COMSTAT Comstat;
  80.         DWORD dwErrorFlags;
  81.         char chrBuffer[iBufferSize]={0};
  82.         unsigned long ulUARTBufferEndTemp=ulUARTBufferEnd[0];

  83.         unsigned long ulComNumber = 0;
  84.         memcpy(&ulComNumber,pParam,4);


  85.         while (1)
  86.         {
  87.                 if ( ! ReadFile(hComDev[ulComNumber],chrBuffer,iBufferSize-1,&uLen,&(stcReadStatus[ulComNumber])) )
  88.                 {
  89.                         dwRes = GetLastError() ;
  90.                         if ( dwRes != ERROR_IO_PENDING)
  91.                         {
  92.                                 ClearCommError(hComDev[ulComNumber],&dwErrorFlags,&Comstat);
  93.                                 continue;
  94.                         }

  95.                         WaitForSingleObject(stcReadStatus[ulComNumber].hEvent,INFINITE);
  96.                         if ( !GetOverlappedResult(hComDev[ulComNumber], &(stcReadStatus[ulComNumber]), &uLen, FALSE))
  97.                                 continue;
  98.                         if(uLen <= 0)
  99.                                 continue;
  100.                         if ( (ulUARTBufferEndTemp + uLen) > UARTBufferLength )
  101.                         {
  102.                                 ulLen1 = UARTBufferLength - ulUARTBufferEndTemp;
  103.                                 ulLen2 = uLen - ulLen1;
  104.                                 if (ulLen1 > 0)
  105.                                 {
  106.                                         memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,ulLen1);
  107.                                 }
  108.                                 if (ulLen2 > 0)
  109.                                 {
  110.                                         memcpy((void *)&chrUARTBuffers[ulComNumber][0],(void *)(chrBuffer+ulLen1),ulLen2);
  111.                                 }
  112.                                 ulUARTBufferEndTemp = ulLen2;
  113.                         }
  114.                         else
  115.                         {
  116.                                 memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,uLen);
  117.                                 ulUARTBufferEndTemp+=uLen;       
  118.                         }

  119.                         if (  ulUARTBufferEndTemp == ulUARTBufferStart[ulComNumber])
  120.                         {
  121.                                 printf("Error!");
  122.                         }
  123.                         else
  124.                         {
  125.                                 ulUARTBufferEnd[ulComNumber] = ulUARTBufferEndTemp;
  126.                         }

  127. #ifdef SYNCHRONOUS_MODE
  128.                         SetEvent(hReceiveEvent[ucComNumber]);
  129. #endif
  130.                         continue;
  131.                 }

  132.                 if(uLen <= 0)
  133.                         continue;
  134.                 if ( (ulUARTBufferEndTemp + uLen) > (UARTBufferLength) )
  135.                 {
  136.                         ulLen1 = UARTBufferLength - ulUARTBufferEndTemp;
  137.                         ulLen2 = uLen - ulLen1;
  138.                         if (ulLen1 > 0)
  139.                         {
  140.                                 memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,ulLen1);
  141.                         }
  142.                         if (ulLen2 > 0)
  143.                         {
  144.                                 memcpy((void *)&chrUARTBuffers[ulComNumber][0],(void *)(chrBuffer+ulLen1),ulLen2);
  145.                         }
  146.                         ulUARTBufferEndTemp = ulLen2;
  147.                 }
  148.                 else
  149.                 {
  150.                         memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,uLen);
  151.                         ulUARTBufferEndTemp+=uLen;       
  152.                 }

  153.                 if (  ulUARTBufferEndTemp== ulUARTBufferStart[ulComNumber])
  154.                 {
  155.                         printf("Error!");
  156.                 }
  157.                 else
  158.                 {
  159.                         ulUARTBufferEnd[ulComNumber] = ulUARTBufferEndTemp;
  160.                 }       

  161. #ifdef SYNCHRONOUS_MODE
  162.                 SetEvent(hReceiveEvent[ucComNumber]);
  163. #endif

  164.         }
  165.         return 0;
  166. }

  167. signed char OpenCOMDevice(const unsigned long ulPortNo,const unsigned long ulBaundrate)
  168. {
  169.         DWORD dwThreadID,dwThreadParam;
  170.         COMSTAT Comstat;
  171.         DWORD dwErrorFlags;
  172.         DWORD dwRes;
  173.         DCB dcb;
  174.         COMMTIMEOUTS comTimeOut;
  175.         TCHAR PortName[10] = {'\\','\\','.','\\','C','O','M',0,0,0};//"\\\\.\\COM";
  176.         TCHAR chrTemple[5]={0};

  177.         if(ulPortNo >= TOTAL_PORT_NUM)
  178.         {
  179.                 printf("\nerror: exceed the max com port num\n");
  180.                 return -1;
  181.         }


  182.         _itot(ulPortNo+START_PORT_NUM,chrTemple,10);
  183.         _tcscat(PortName,chrTemple);

  184.         if((hComDev[ulPortNo] = CreateFile(PortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL))==INVALID_HANDLE_VALUE)
  185.         {
  186.                 dwRes=GetLastError();
  187.                 return -1;
  188.         }
  189.         ulComMask |= 1<<ulPortNo;

  190.         SetupComm(hComDev[ulPortNo] ,iBufferSize,iBufferSize);
  191.         GetCommState(hComDev[ulPortNo] ,&dcb);
  192.                 dcb.BaudRate = ulBaundrate;
  193.         dcb.fParity = NOPARITY;
  194.         dcb.ByteSize=8;
  195.         dcb.fDtrControl = 1;//DTR = 0;接收
  196.         dcb.fRtsControl = 0;//RTS = 0;接收
  197.         dcb.StopBits=ONESTOPBIT;

  198.         SetCommState(hComDev[ulPortNo] ,&dcb);
  199.         ClearCommError(hComDev[ulPortNo] ,&dwErrorFlags,&Comstat);
  200.         dwRes = GetLastError();

  201.         comTimeOut.ReadIntervalTimeout = 5;                               
  202.         comTimeOut.ReadTotalTimeoutMultiplier = 10;               
  203.         comTimeOut.ReadTotalTimeoutConstant = 100;               
  204.         comTimeOut.WriteTotalTimeoutMultiplier = 5;               
  205.         comTimeOut.WriteTotalTimeoutConstant = 5;               
  206.         SetCommTimeouts(hComDev[ulPortNo] ,&comTimeOut);       

  207.         stcWriteStatus[ulPortNo] .hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  208.         stcReadStatus[ulPortNo] .hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  209.         stcReadStatus[ulPortNo].Internal = 0;
  210.         stcReadStatus[ulPortNo].InternalHigh = 0;
  211.         stcReadStatus[ulPortNo].Offset = 0;
  212.         stcReadStatus[ulPortNo].OffsetHigh = 0;
  213.         dwThreadParam = ulPortNo;
  214.         hCOMThread[dwThreadParam] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveCOMData,&dwThreadParam,0,&dwThreadID);
  215.         SetThreadPriority(hCOMThread[ulPortNo],THREAD_PRIORITY_NORMAL);
  216.         Sleep(200);

  217.         return 0;

  218. }

  219. signed char SetBaundrate(const unsigned long ulPortNo,const unsigned long ulBaundrate)
  220. {

  221.         DCB dcb;       
  222.         GetCommState(hComDev[ulPortNo] ,&dcb);
  223.         dcb.BaudRate = ulBaundrate;
  224.         SetCommState(hComDev[ulPortNo] ,&dcb);
  225.         return 0;

  226. }
  227. void CloseCOMDevice()
  228. {
  229.         unsigned char i;
  230.         for(i=0 ; i<sizeof(ulComMask)*8 ; i++)
  231.         {
  232.                 if((ulComMask & (1<<i))==0)
  233.                         continue;
  234.                 ulUARTBufferEnd[i] = 0;ulUARTBufferStart[i]=0;
  235.                 TerminateThread(hCOMThread[i],0);
  236.                 WaitForSingleObject(hCOMThread[i],10000);
  237.                 PurgeComm(hComDev[i],PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
  238.                 CloseHandle(stcReadStatus[i].hEvent);
  239.                 CloseHandle(stcWriteStatus[i].hEvent);
  240.                 CloseHandle(hComDev[i]);
  241.         }
  242.         ulComMask = 0;
  243. }
復(fù)制代碼


單片機(jī)多模塊.rar

22.29 KB, 下載次數(shù): 11, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天久久| 欧美精品三区 | 国产精品视频久久久 | 美女久久| 久久人人网 | 久久精品视频播放 | 韩国成人在线视频 | 国产精品久久久久久久久图文区 | 一级毛片在线播放 | 日本免费一区二区三区 | 欧美一二三| 国产第一页在线播放 | 日韩欧美亚洲 | 99久久精品免费看国产免费软件 | 欧美在线a| 欧美高清性xxxxhd | 日韩av免费在线电影 | 久久久久久久久久影视 | 免费黄色成人 | 国产精品a免费一区久久电影 | 亚洲精品免费在线 | 国产成人高清成人av片在线看 | 久久精品毛片 | 久久久精品 | av在线一区二区 | 九九av| 日本高清精品 | 成人精品一区二区三区 | 国产电影一区二区三区爱妃记 | 午夜视频网站 | 精品国产不卡一区二区三区 | 青青艹在线视频 | 国产午夜影院 | 日韩精品一区二区三区 | 欧美日韩淫片 | 欧美在线观看一区 | 精品美女视频在线观看免费软件 | 曰韩三级 | 亚洲福利视频一区二区 | 久久人人爽人人爽 | 国产成人av免费看 |