第一次写博客记录一下最近写的一个程序吧,这是在visual studio 2010下用window api写的,主要用于读5个RS485里面的数据进而判断具体有几个sensor响应,然后判断小车的位置。
#include "stdafx.h"
#include <Windows.h>
#include <process.h>
#define address_num 5 //挂载的从设备个数
#define getdata_num 2 //读取数据长度
#define car_length 4 //车的长度
#define sensor_length 2 //sensor 的间隔
HANDLE hCom;
WORD sensor[5]={0x03ff,0x03ff,0x03ff,0x03fff,0x03ff};
struct realmessage{ //最后获取的数据
BYTE address;
WORD data[getdata_num];
}value1[address_num -1];
struct sendmessage{ //发送的命令集包
BYTE data[8];
static const int length = 8;
};
struct getmessage{ //从设备返回的数值
BYTE data[5 + 2*getdata_num];
static const int length=5 + 2*getdata_num;
};
struct dataformat //命令包的数据格式
{
BYTE address[address_num];
BYTE type;
WORD start;
WORD length;
};
//读函数
int readfile(HANDLE hCom,BYTE *str,int count,DWORD *wCount)
{
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
BOOL bReadStatus;
bReadStatus=ReadFile(hCom,str,count,wCount,&m_osRead);
//printf("read status= %d\n",bReadStatus);
if(!bReadStatus) //如果ReadFile函数返回FALSE
{
if(GetLastError()==ERROR_IO_PENDING) //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(m_osRead.hEvent,2000); //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return bReadStatus;
}
return 0;
}
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return bReadStatus;
}
//写函数
int writefile(HANDLE hCom,BYTE *str,int count,DWORD *wCount)
{
COMSTAT ComStat;
DWOR