一般无法读取导数据,通常是读数据时间设定有问题,通过修改设定时间就可以轻松读取数据.
BOOL OpenComPort(const int port,int flag)
{
CString strComCode;
strComCode.Format(_T(“COM%d”),port);
hCom=CreateFile(strComCode,//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox(L"打开COM失败!");
CloseHandle(hCom);
return FALSE;
}
SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024COMMTIMEOUTS TimeOuts;
TimeOuts.ReadIntervalTimeout=MAXDWORD;
**TimeOuts.ReadTotalTimeoutMultiplier=10;
TimeOuts.ReadTotalTimeoutConstant=10;**
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=7; //每个字节有7位
dcb.Parity=EVENPARITY/NOPARITY/; //偶校验位
dcb.StopBits=TWOSTOPBITS; //两个停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);return TRUE;
}
串口硬件配置上,波特率,奇偶校验最好都改成这样,这样有一个好处,串口的响应速度也会变快,缩短等待时间
BOOL ReadData(char readBuffer[])
{
DWORD length = 128;//长度也很关键,如果设置为0.直接返回,不会读渠道任何数据
memset(readBuffer, ‘\0’, 256);
BOOL bReadStat = ReadFile(hCom, readBuffer, length, &length, NULL);
if (!bReadStat)
{
AfxMessageBox(_T(“温控器1读取数据失败!”));
CloseHandle(hCom);
hCom = NULL;
return FALSE;
}
PurgeComm(hCom, PURGE_TXABORT |
PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return TRUE;
}
BOOL SendData(char* p,const int len, char writeBuffer[],CString strCRC)
{
for(…)
writeBuffer[i]=XXX;
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,writeBuffer,strlen(writeBuffer),& dwBytesWrite,NULL);
if(!bWriteStat)
{AfxMessageBox(L"写串口失败!#add1");return FALSE;
}
returnTRUE;
}
这样我们就可以写度,读数据,当然数据解析也很重要,转换成你需要的数据类型就可以了.