辽中县离哪最近:使用Win32API实现Windows下异步串口通讯(下)
来源:百度文库 编辑:中财网 时间:2024/05/09 02:50:55
只一个框架性流程而矣............
实现重叠模型的步骤
下面就结合俺写的一个Console程序简单示例进行说明:
【第一步】打开串口
HANDLE m_hCom = CreateFile("com1",GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (m_hCom == INVALID_HANDLE_VALUE)
{
cout<<"CreateFile fail!"<<>
return -1;
}
cout<<"CreateFile OK!"<<>< p="">
【第二步】设置缓冲区大小
if(!SetupComm(m_hCom,2048,2048))
{
cout<<"SetupComm fail! Close Comm!"<<>
CloseHandle(m_hCom);
return -1;
}
cout<<"SetupComm OK!"<<>< p="">
【第三步】设置超时
COMMTIMEOUTS TimeOuts;
memset(&TimeOuts,0,sizeof(TimeOuts));
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutConstant = 0;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.WriteTotalTimeoutConstant = 2000;
TimeOuts.WriteTotalTimeoutMultiplier = 50;
SetCommTimeouts(m_hCom,&TimeOuts);
【第四步】设置串口参数
DCB dcb;
if (!GetCommState(m_hCom,&dcb))
{
cout<<"GetCommState fail! Comm close"<<>
CloseHandle(m_hCom);
return -1;
}
cout<<"GetCommState OK!"<<>
dcb.DCBlength = sizeof(dcb);
if (!BuildCommDCB("9600,n,8,1",&dcb))//填充DCB的数据传输率、奇偶校验类型、数据位、停止位
{
//参数修改错误,进行错误处理
cout<<"BuileCOmmDCB fail,Comm close!"<<>
CloseHandle(m_hCom);
return -1;
}
if(SetCommState(m_hCom,&dcb))
{
cout<<"SetCommState OK!"<<>
}
【第五步】建立并初始化重叠结构
OVERLAPPED wrOverlapped;
ZeroMemory(&wrOverlapped,sizeof(wrOverlapped));
if (wrOverlapped.hEvent != NULL)
{
ResetEvent(wrOverlapped.hEvent);
wrOverlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
}
【第六步】封装数据(按照自己的格式封装需要发送的数据,此步可以省略)
typedef enum
{
HEAT_BEAT, //心跳数据
NET_STATE,//网络状态数据
PACKET //正常数据包
//支持可扩展性......
}ProtocolType;
typedef enum
{
Train_No,//无线车次信息
Attemper_Command,//调度命令信息
Revert_Command,//调度命令回执信息
Replay_Command,//重发的调度命令信息
KGL_SING //开关量数据
//支持可扩展性......
}PacketDataType;
//串口数据结构
typedef struct SerialNetProto
{
unsigned long PacketSize; //包总长度,不包括本身字段
ProtocolType NetState; //协议包类型
PacketDataType DataType; //数据类型
unsigned long SourcedAddr; //数据包源地址
unsigned long DestinationAddr; //数据包目的地址
unsigned long DataLength; //包的数据段长度
unsigned long Offset; // 数据在整个包中的偏移地址
}PacketHead;
int DataLen = 100;
char *