找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3787|回复: 0
收起左侧

C语言读取模块实例程序VS2010

[复制链接]
ID:114240 发表于 2016-4-15 18:24 | 显示全部楼层 |阅读模式
========================================================================
    控制台应用程序:UARTTest 项目概述
========================================================================

应用程序向导已为您创建了此 UARTTest 应用程序。

本文件概要介绍组成 UARTTest 应用程序的每个文件的内容。


UARTTest.vcxproj
    这是使用应用程序向导生成的 VC++ 项目的主项目文件,
    其中包含生成该文件的 Visual C++
    的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。

UARTTest.vcxproj.filters
    这是使用“应用程序向导”生成的 VC++ 项目筛选器文件。
    它包含有关项目文件与筛选器之间的关联信息。 在 IDE
    中,通过这种关联,在特定节点下以分组形式显示具有相似扩展名的文件。
    例如,“.cpp”文件与“源文件”筛选器关联。

UARTTest.cpp
    这是主应用程序源文件。

/////////////////////////////////////////////////////////////////////////////
其他标准文件:

StdAfx.h,StdAfx.cpp
    这些文件用于生成名为 UARTTest.pch 的预编译头 (PCH) 文件和
    名为 StdAfx.obj 的预编译类型文件。

/////////////////////////////////////////////////////////////////////////////
其他注释:

应用程序向导使用“TODO:”注释来指示应添加或自定义的源代码部分。

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


  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;发送
  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. }
复制代码


单片机多模块.rar

22.29 KB, 下载次数: 11, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表