久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
C語言讀取模塊實例程序VS2010
[打印本頁]
作者:
Summer·
時間:
2016-4-15 18:24
標題:
C語言讀取模塊實例程序VS2010
========================================================================
控制臺應用程序: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:”注釋來指示應添加或自定義的源代碼部分。
/////////////////////////////////////////////////////////////////////////////
#include <stdafx.h>
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include "Com.h"
#define TOTAL_PORT_NUM 65
#define START_PORT_NUM 0
#define iBufferSize 250
#define UARTBufferLength 98304
#undef SYNCHRONOUS_MODE
static HANDLE hComDev[TOTAL_PORT_NUM] ={NULL};
static unsigned long long ulComMask = 0;
static HANDLE hCOMThread[TOTAL_PORT_NUM] ={NULL};
static OVERLAPPED stcWriteStatus[TOTAL_PORT_NUM] = {0};
static OVERLAPPED stcReadStatus[TOTAL_PORT_NUM] = {0};
#ifdef SYNCHRONOUS_MODE
static HANDLE hReceiveEvent[TOTAL_PORT_NUM] ={NULL};
#endif
static volatile char chrUARTBuffers[TOTAL_PORT_NUM][UARTBufferLength]={0};
static volatile unsigned long ulUARTBufferStart[TOTAL_PORT_NUM]={0}, ulUARTBufferEnd[UARTBufferLength]={0};
unsigned short CollectUARTData(const unsigned long ulCOMNo,char chrUARTBufferOutput[])
{
unsigned long ulLength=0;
unsigned long ulEnd ;
unsigned long ulStart ;
#ifdef SYNCHRONOUS_MODE
WaitForSingleObject(hReceiveEvent[ulIndexCorrect],INFINITE);
ResetEvent(hReceiveEvent[ulIndexCorrect]);
#endif
ulEnd = ulUARTBufferEnd[ulCOMNo];
ulStart = ulUARTBufferStart[ulCOMNo];
if (ulEnd == ulStart)
return(0);
if (ulEnd > ulStart)
{
memcpy((void*)chrUARTBufferOutput,(void*)(chrUARTBuffers[ulCOMNo]+ulStart),ulEnd-ulStart);
ulLength = ulEnd-ulStart;
}
else
{
memcpy((void*)chrUARTBufferOutput,(void*)(chrUARTBuffers[ulCOMNo]+ulStart),UARTBufferLength-ulStart);
if ( ulEnd != 0 )
{
memcpy((void*)(chrUARTBufferOutput+(UARTBufferLength-ulStart)),(void*)chrUARTBuffers[ulCOMNo],ulEnd);
}
ulLength = UARTBufferLength+ulEnd-ulStart;
}
ulUARTBufferStart[ulCOMNo] = ulEnd;
return (unsigned short) ulLength;
}
signed char SendUARTMessageLength(const unsigned long ulChannelNo, const char chrSendBuffer[],const unsigned short usLen)
{
DWORD iR;
DWORD dwRes;
DCB dcb;
char chrDataToSend[1000] = {0};
memcpy(chrDataToSend,chrSendBuffer,usLen);
memcpy(&chrDataToSend[usLen],chrSendBuffer,usLen);
GetCommState(hComDev[ulChannelNo] ,&dcb);
dcb.fDtrControl = 0;//DTR = 1;發送
SetCommState(hComDev[ulChannelNo] ,&dcb);
if ( WriteFile(hComDev[ulChannelNo],chrSendBuffer,usLen,&iR,&(stcWriteStatus[ulChannelNo])) || GetLastError() != ERROR_IO_PENDING )
return -1;
dwRes = WaitForSingleObject(stcWriteStatus[ulChannelNo].hEvent,1000);
Sleep(10);
dcb.fDtrControl = 1;//DTR = 0;接收
SetCommState(hComDev[ulChannelNo] ,&dcb);
Sleep(10);
if(dwRes != WAIT_OBJECT_0 || ! GetOverlappedResult(hComDev[ulChannelNo], &stcWriteStatus[ulChannelNo], &iR, FALSE))
return 0;
return 0;
}
DWORD WINAPI ReceiveCOMData(PVOID pParam)
{
unsigned long uLen;
unsigned long ulLen1;
unsigned long ulLen2;
DWORD dwRes;
COMSTAT Comstat;
DWORD dwErrorFlags;
char chrBuffer[iBufferSize]={0};
unsigned long ulUARTBufferEndTemp=ulUARTBufferEnd[0];
unsigned long ulComNumber = 0;
memcpy(&ulComNumber,pParam,4);
while (1)
{
if ( ! ReadFile(hComDev[ulComNumber],chrBuffer,iBufferSize-1,&uLen,&(stcReadStatus[ulComNumber])) )
{
dwRes = GetLastError() ;
if ( dwRes != ERROR_IO_PENDING)
{
ClearCommError(hComDev[ulComNumber],&dwErrorFlags,&Comstat);
continue;
}
WaitForSingleObject(stcReadStatus[ulComNumber].hEvent,INFINITE);
if ( !GetOverlappedResult(hComDev[ulComNumber], &(stcReadStatus[ulComNumber]), &uLen, FALSE))
continue;
if(uLen <= 0)
continue;
if ( (ulUARTBufferEndTemp + uLen) > UARTBufferLength )
{
ulLen1 = UARTBufferLength - ulUARTBufferEndTemp;
ulLen2 = uLen - ulLen1;
if (ulLen1 > 0)
{
memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,ulLen1);
}
if (ulLen2 > 0)
{
memcpy((void *)&chrUARTBuffers[ulComNumber][0],(void *)(chrBuffer+ulLen1),ulLen2);
}
ulUARTBufferEndTemp = ulLen2;
}
else
{
memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,uLen);
ulUARTBufferEndTemp+=uLen;
}
if ( ulUARTBufferEndTemp == ulUARTBufferStart[ulComNumber])
{
printf("Error!");
}
else
{
ulUARTBufferEnd[ulComNumber] = ulUARTBufferEndTemp;
}
#ifdef SYNCHRONOUS_MODE
SetEvent(hReceiveEvent[ucComNumber]);
#endif
continue;
}
if(uLen <= 0)
continue;
if ( (ulUARTBufferEndTemp + uLen) > (UARTBufferLength) )
{
ulLen1 = UARTBufferLength - ulUARTBufferEndTemp;
ulLen2 = uLen - ulLen1;
if (ulLen1 > 0)
{
memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,ulLen1);
}
if (ulLen2 > 0)
{
memcpy((void *)&chrUARTBuffers[ulComNumber][0],(void *)(chrBuffer+ulLen1),ulLen2);
}
ulUARTBufferEndTemp = ulLen2;
}
else
{
memcpy((void *)&chrUARTBuffers[ulComNumber][ulUARTBufferEnd[ulComNumber]],(void *)chrBuffer,uLen);
ulUARTBufferEndTemp+=uLen;
}
if ( ulUARTBufferEndTemp== ulUARTBufferStart[ulComNumber])
{
printf("Error!");
}
else
{
ulUARTBufferEnd[ulComNumber] = ulUARTBufferEndTemp;
}
#ifdef SYNCHRONOUS_MODE
SetEvent(hReceiveEvent[ucComNumber]);
#endif
}
return 0;
}
signed char OpenCOMDevice(const unsigned long ulPortNo,const unsigned long ulBaundrate)
{
DWORD dwThreadID,dwThreadParam;
COMSTAT Comstat;
DWORD dwErrorFlags;
DWORD dwRes;
DCB dcb;
COMMTIMEOUTS comTimeOut;
TCHAR PortName[10] = {'\\','\\','.','\\','C','O','M',0,0,0};//"\\\\.\\COM";
TCHAR chrTemple[5]={0};
if(ulPortNo >= TOTAL_PORT_NUM)
{
printf("\nerror: exceed the max com port num\n");
return -1;
}
_itot(ulPortNo+START_PORT_NUM,chrTemple,10);
_tcscat(PortName,chrTemple);
if((hComDev[ulPortNo] = CreateFile(PortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL))==INVALID_HANDLE_VALUE)
{
dwRes=GetLastError();
return -1;
}
ulComMask |= 1<<ulPortNo;
SetupComm(hComDev[ulPortNo] ,iBufferSize,iBufferSize);
GetCommState(hComDev[ulPortNo] ,&dcb);
dcb.BaudRate = ulBaundrate;
dcb.fParity = NOPARITY;
dcb.ByteSize=8;
dcb.fDtrControl = 1;//DTR = 0;接收
dcb.fRtsControl = 0;//RTS = 0;接收
dcb.StopBits=ONESTOPBIT;
SetCommState(hComDev[ulPortNo] ,&dcb);
ClearCommError(hComDev[ulPortNo] ,&dwErrorFlags,&Comstat);
dwRes = GetLastError();
comTimeOut.ReadIntervalTimeout = 5;
comTimeOut.ReadTotalTimeoutMultiplier = 10;
comTimeOut.ReadTotalTimeoutConstant = 100;
comTimeOut.WriteTotalTimeoutMultiplier = 5;
comTimeOut.WriteTotalTimeoutConstant = 5;
SetCommTimeouts(hComDev[ulPortNo] ,&comTimeOut);
stcWriteStatus[ulPortNo] .hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
stcReadStatus[ulPortNo] .hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
stcReadStatus[ulPortNo].Internal = 0;
stcReadStatus[ulPortNo].InternalHigh = 0;
stcReadStatus[ulPortNo].Offset = 0;
stcReadStatus[ulPortNo].OffsetHigh = 0;
dwThreadParam = ulPortNo;
hCOMThread[dwThreadParam] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveCOMData,&dwThreadParam,0,&dwThreadID);
SetThreadPriority(hCOMThread[ulPortNo],THREAD_PRIORITY_NORMAL);
Sleep(200);
return 0;
}
signed char SetBaundrate(const unsigned long ulPortNo,const unsigned long ulBaundrate)
{
DCB dcb;
GetCommState(hComDev[ulPortNo] ,&dcb);
dcb.BaudRate = ulBaundrate;
SetCommState(hComDev[ulPortNo] ,&dcb);
return 0;
}
void CloseCOMDevice()
{
unsigned char i;
for(i=0 ; i<sizeof(ulComMask)*8 ; i++)
{
if((ulComMask & (1<<i))==0)
continue;
ulUARTBufferEnd[i] = 0;ulUARTBufferStart[i]=0;
TerminateThread(hCOMThread[i],0);
WaitForSingleObject(hCOMThread[i],10000);
PurgeComm(hComDev[i],PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
CloseHandle(stcReadStatus[i].hEvent);
CloseHandle(stcWriteStatus[i].hEvent);
CloseHandle(hComDev[i]);
}
ulComMask = 0;
}
復制代碼
單片機多模塊.rar
2016-4-15 18:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
22.29 KB, 下載次數: 11, 下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
97天天干
|
欧美一区视频
|
在线看国产
|
亚洲欧美日本在线
|
午夜精品影院
|
国产精品成人久久久久a级 久久蜜桃av一区二区天堂
|
日韩电影一区二区三区
|
超碰成人免费观看
|
日韩欧美国产一区二区三区
|
久在线视频播放免费视频
|
无码一区二区三区视频
|
中文字幕一区在线观看视频
|
综合天天久久
|
国产sm主人调教女m视频
|
91精品国产一区二区三区香蕉
|
国产精品久久久久久久久久久久
|
成人综合一区
|
日日噜噜噜夜夜爽爽狠狠视频,
|
欧美区日韩区
|
麻豆91av
|
亚洲a级
|
日本黄视频在线观看
|
色欧美片视频在线观看
|
99在线播放
|
日韩不卡在线
|
国产亚洲一级
|
成人一区二区在线
|
一区二区视频
|
亚洲国产成人av
|
中文字幕国产在线
|
国产日韩欧美
|
91成人在线视频
|
人人看人人草
|
久久亚洲一区二区三区四区
|
欧美又大粗又爽又黄大片视频
|
久久精品国产一区老色匹
|
成人不卡
|
91日日
|
91传媒在线观看
|
欧美日韩在线观看一区
|
免费观看的黄色网址
|