几个问题:(串口) 1:串口通讯几种方法?2:我怎样实现?比较简单的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般有三种:1.MSCOMM 这时Ms的控件,比较容易,但不是很灵活,需要注册!2.API的CreateFile,readFile,WriteFile 比较灵活,难度中等!3.C+汇编这个一般使用高级用户,难度较大。给你我的一个项目的API:// TSerial.cpp: implementation of the TSerial class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "ECS.h"#include "TSerial.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TSerial::TSerial(){ m_bOpened=false;}TSerial::~TSerial(){}bool TSerial::Open(int nPort,int nBand,int nByteSize){ if(m_bOpened) return true; char szPort[15]; CString Er; DCB dcb; wsprintf(szPort,"COM%d",nPort); m_hCommDev=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); if(m_hCommDev==NULL) return false; memset(&m_OverlappedRead,0,sizeof(OVERLAPPED)); memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED)); COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier=0; CommTimeOuts.ReadTotalTimeoutConstant=0; CommTimeOuts.WriteTotalTimeoutConstant=1000; CommTimeOuts.WriteTotalTimeoutMultiplier=0; SetCommTimeouts(m_hCommDev,&CommTimeOuts); m_OverlappedRead.hEvent=CreateEvent(NULL,true,false,NULL); m_OverlappedWrite.hEvent=CreateEvent(NULL,true,false,NULL); dcb.DCBlength=sizeof(DCB); GetCommState(m_hCommDev,&dcb); dcb.BaudRate=nBand; dcb.ByteSize=nByteSize; if(!SetCommState(m_hCommDev,&dcb)||!SetupComm(m_hCommDev,10000,10000)||m_OverlappedRead.hEvent==NULL||m_OverlappedWrite.hEvent==NULL) { DWORD dwError=GetLastError(); if(m_OverlappedRead.hEvent!=NULL) CloseHandle(m_OverlappedRead.hEvent); if(m_OverlappedWrite.hEvent!=NULL) CloseHandle(m_OverlappedWrite.hEvent); CloseHandle(m_hCommDev); Er.Format("%d",dwError); MessageBox(NULL,Er,"提示",MB_OK); return false; } m_bOpened=true; return m_bOpened;}DWORD TSerial::ReadData(void *buffer,DWORD dwBytesRead){ if(!m_bOpened||m_hCommDev==NULL) return 0; BOOL bReadStat; DWORD dwErrorFlags; COMSTAT ComStat; ClearCommError(m_hCommDev,&dwErrorFlags,&ComStat); if(!ComStat.cbInQue) return 0; dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue); bReadStat=ReadFile(m_hCommDev,buffer,dwBytesRead,&dwBytesRead,&m_OverlappedRead); if(!bReadStat) { if(GetLastError()==ERROR_IO_PENDING) { WaitForSingleObject(m_OverlappedRead.hEvent,2000); return dwBytesRead; } return 0; } return dwBytesRead;}DWORD TSerial::SendData(const char *buffer,DWORD dwBytesWritten){ if(!m_bOpened||m_hCommDev==NULL) return 0; BOOL bWriteStat; bWriteStat=WriteFile(m_hCommDev,buffer,dwBytesWritten,&dwBytesWritten,&m_OverlappedWrite); if(!bWriteStat) { if(GetLastError()==ERROR_IO_PENDING) { WaitForSingleObject(m_OverlappedWrite.hEvent,1000); return dwBytesWritten; } return 0; } return dwBytesWritten;}int TSerial::InBufferCount(){ if(!m_bOpened||m_hCommDev==NULL) return 0; DWORD dwErrorFlags; COMSTAT ComStat; ClearCommError(m_hCommDev,&dwErrorFlags,&ComStat); return (int)ComStat.cbInQue;} /* char buffer[1000]={""}; //一定要让他初始化!!!!! UpdateData(true); for(int i=0;i<m_Send.GetLength();i++) buffer[i]=m_Send[i]; if(MyCom.Open(1,9600)) MyCom.SendData(buffer,m_Send.GetLength()); if(MyCom2.Open(2,9600)) { MyCom2.ReadData(buffer,m_Send.GetLength()); m_Rec=CString(buffer); UpdateData(false); } */void TSerial::Conv17_26(char T[17],int Number,char Result[26]){ //T[17]是头子,既是data[] 以前的数据, //Number 是填写的数据,对于D0003 就是通道数,对于D0001就是采集数, //对于M0000,则是置1还是复0 //Result 是最后结果。 int p=0; char D[3]={""}; char data[4]={""};/* if(Number<10) { data[0]='\x30'; data[1]='\x30'+Number; } else { if(Number<16) { data[0]='\x30'; data[1]='\x40'+Number-9; } else { data[0]='\x31'; data[1]='\x30'+Number-16; } }*/ if(Number<10) { data[0]='\x30'; data[1]='\x30'+Number; } else { if(Number<16) { data[0]='\x30'; data[1]='\x40'+Number-9; } else if(Number<26) { data[0]='\x31'; data[1]='\x30'+Number-16; } else if(Number<32) { data[0]='\x31'; data[1]='\x40'+Number-25; } else if(Number<42) { data[0]='\x32'; data[1]='\x30'+Number-32; } else if(Number<48) { data[0]='\x32'; data[1]='\x40'+Number-41; } else if(Number<58) { data[0]='\x33'; data[1]='\x30'+Number-48; } else if(Number<64) { data[0]='\x33'; data[1]='\x40'+Number-57; } else if(Number<74) { data[0]='\x34'; data[1]='\x30'+Number-64; } else if(Number<80) { data[0]='\x34'; data[1]='\x40'+Number-73; } else if(Number<90) { data[0]='\x35'; data[1]='\x30'+Number-80; } else //if(Number<96) { data[0]='\x35'; data[1]='\x40'+Number-89; } } Result[0]=T[0]; for(int i=1;i<17;i++) { Result[i]=T[i]; p+=T[i]; } p+=data[0]; p+=data[1]; sprintf(D,"%x",p); p=CharToInt(D[1]); p>9?data[2]=('\x40'+p-9):data[2]=('\x30'+p); p=CharToInt(D[2]); p>9?data[3]=('\x40'+p-9):data[3]=('\x30'+p); for(i=0;i<4;i++) { Result[17+i]=data[i]; } Result[21]='\x06'; Result[22]='\x30'; Result[23]='\x30'; Result[24]='\x46'; Result[25]='\x46';}int TSerial::CharToInt(char p){ if(p<='9'&&p>='0') return (int)(p-'0'); else if(p>='A'&&p<='F') return (int)(10+p-'A'); else return (int)(10+p-'a'); }希望对你有用! See the link below, several samples there , useful :http://www.codeproject.com/system/#Hardware programming Critical Section... AfxParseURL函数解析Http地址时发生错误 xml设计UI界面 串口 银行用密码键盘,怎么区分“请输入密码”,和“请再次输入密码”,信号量吗? 超级郁闷问题,高分相送。 *****谁有Xinu的源代码啊******** 哪里可以找到字库资源? 如何彻底地关闭对话框? HELP ME!我调用AfxBeginThread(),51分 小弟这有段代码,想请帮忙看看,每句语句是什么意思有什么作用 createprocess问题 一个简单问题
1.MSCOMM 这时Ms的控件,比较容易,但不是很灵活,需要注册!
2.API的CreateFile,readFile,WriteFile 比较灵活,难度中等!
3.C+汇编这个一般使用高级用户,难度较大。给你我的一个项目的API:
// TSerial.cpp: implementation of the TSerial class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "ECS.h"
#include "TSerial.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
TSerial::TSerial()
{
m_bOpened=false;
}TSerial::~TSerial()
{}
bool TSerial::Open(int nPort,int nBand,int nByteSize)
{
if(m_bOpened)
return true;
char szPort[15];
CString Er;
DCB dcb;
wsprintf(szPort,"COM%d",nPort);
m_hCommDev=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
if(m_hCommDev==NULL)
return false;
memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));
memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier=0;
CommTimeOuts.ReadTotalTimeoutConstant=0;
CommTimeOuts.WriteTotalTimeoutConstant=1000;
CommTimeOuts.WriteTotalTimeoutMultiplier=0;
SetCommTimeouts(m_hCommDev,&CommTimeOuts); m_OverlappedRead.hEvent=CreateEvent(NULL,true,false,NULL);
m_OverlappedWrite.hEvent=CreateEvent(NULL,true,false,NULL); dcb.DCBlength=sizeof(DCB);
GetCommState(m_hCommDev,&dcb);
dcb.BaudRate=nBand;
dcb.ByteSize=nByteSize;
if(!SetCommState(m_hCommDev,&dcb)||!SetupComm(m_hCommDev,10000,10000)||m_OverlappedRead.hEvent==NULL||m_OverlappedWrite.hEvent==NULL)
{
DWORD dwError=GetLastError();
if(m_OverlappedRead.hEvent!=NULL) CloseHandle(m_OverlappedRead.hEvent);
if(m_OverlappedWrite.hEvent!=NULL) CloseHandle(m_OverlappedWrite.hEvent);
CloseHandle(m_hCommDev);
Er.Format("%d",dwError);
MessageBox(NULL,Er,"提示",MB_OK);
return false;
}
m_bOpened=true;
return m_bOpened;
}
DWORD TSerial::ReadData(void *buffer,DWORD dwBytesRead)
{
if(!m_bOpened||m_hCommDev==NULL) return 0;
BOOL bReadStat;
DWORD dwErrorFlags;
COMSTAT ComStat; ClearCommError(m_hCommDev,&dwErrorFlags,&ComStat);
if(!ComStat.cbInQue) return 0;
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
bReadStat=ReadFile(m_hCommDev,buffer,dwBytesRead,&dwBytesRead,&m_OverlappedRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_OverlappedRead.hEvent,2000);
return dwBytesRead;
}
return 0;
}
return dwBytesRead;
}
DWORD TSerial::SendData(const char *buffer,DWORD dwBytesWritten)
{
if(!m_bOpened||m_hCommDev==NULL)
return 0;
BOOL bWriteStat;
bWriteStat=WriteFile(m_hCommDev,buffer,dwBytesWritten,&dwBytesWritten,&m_OverlappedWrite);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_OverlappedWrite.hEvent,1000);
return dwBytesWritten;
}
return 0;
}
return dwBytesWritten;}
int TSerial::InBufferCount()
{
if(!m_bOpened||m_hCommDev==NULL)
return 0;
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError(m_hCommDev,&dwErrorFlags,&ComStat);
return (int)ComStat.cbInQue;
}
/*
char buffer[1000]={""}; //一定要让他初始化!!!!!
UpdateData(true);
for(int i=0;i<m_Send.GetLength();i++)
buffer[i]=m_Send[i];
if(MyCom.Open(1,9600))
MyCom.SendData(buffer,m_Send.GetLength());
if(MyCom2.Open(2,9600))
{
MyCom2.ReadData(buffer,m_Send.GetLength());
m_Rec=CString(buffer);
UpdateData(false);
} */void TSerial::Conv17_26(char T[17],int Number,char Result[26])
{
//T[17]是头子,既是data[] 以前的数据,
//Number 是填写的数据,对于D0003 就是通道数,对于D0001就是采集数,
//对于M0000,则是置1还是复0 //Result 是最后结果。
int p=0;
char D[3]={""};
char data[4]={""};
/* if(Number<10)
{
data[0]='\x30';
data[1]='\x30'+Number;
}
else
{
if(Number<16)
{
data[0]='\x30';
data[1]='\x40'+Number-9;
}
else
{
data[0]='\x31';
data[1]='\x30'+Number-16;
}
}
*/
if(Number<10)
{
data[0]='\x30';
data[1]='\x30'+Number;
}
else
{
if(Number<16)
{
data[0]='\x30';
data[1]='\x40'+Number-9;
}
else if(Number<26)
{
data[0]='\x31';
data[1]='\x30'+Number-16;
}
else if(Number<32)
{
data[0]='\x31';
data[1]='\x40'+Number-25;
}
else if(Number<42)
{
data[0]='\x32';
data[1]='\x30'+Number-32;
}
else if(Number<48)
{
data[0]='\x32';
data[1]='\x40'+Number-41;
}
else if(Number<58)
{
data[0]='\x33';
data[1]='\x30'+Number-48;
}
else if(Number<64)
{
data[0]='\x33';
data[1]='\x40'+Number-57;
}
else if(Number<74)
{
data[0]='\x34';
data[1]='\x30'+Number-64;
}
else if(Number<80)
{
data[0]='\x34';
data[1]='\x40'+Number-73;
}
else if(Number<90)
{
data[0]='\x35';
data[1]='\x30'+Number-80;
}
else //if(Number<96)
{
data[0]='\x35';
data[1]='\x40'+Number-89;
}
}
Result[0]=T[0];
for(int i=1;i<17;i++)
{
Result[i]=T[i];
p+=T[i];
} p+=data[0];
p+=data[1];
sprintf(D,"%x",p);
p=CharToInt(D[1]);
p>9?data[2]=('\x40'+p-9):data[2]=('\x30'+p); p=CharToInt(D[2]);
p>9?data[3]=('\x40'+p-9):data[3]=('\x30'+p); for(i=0;i<4;i++)
{
Result[17+i]=data[i];
}
Result[21]='\x06';
Result[22]='\x30';
Result[23]='\x30';
Result[24]='\x46';
Result[25]='\x46';
}
int TSerial::CharToInt(char p)
{
if(p<='9'&&p>='0')
return (int)(p-'0');
else if(p>='A'&&p<='F')
return (int)(10+p-'A');
else
return (int)(10+p-'a');
}希望对你有用!