API函数串口通信数据有时读取不到,但是其他串口工具能读出输入数据

赵柒 2014-08-24 04:45:40
能够正常打开串口,也能够写入。当用其他串口工具打开一次串口然后关闭,自己写的程序能够正常读写,同步异步出现的问题都是同样。

有时候对设备输入关机指令,然后进行通信,读取数据的时候不能读取,ClearCommError函数显示输入数据永远为0;

我观察了一下了句柄值一直不变


#include "StdAfx.h"
#include "CreatePort.h"
CreatePort ::CreatePort( void):m_comName (_T( "" )),hFileHandle ( NULL),cbInQue (0),cbOutQue(0)
, dwFlagsAndAttributes (FILE_ATTRIBUTE_NORMAL),dwError (0)
{
}
CreatePort ::~CreatePort( void)
{
}

BOOL CreatePort:: Create()
{

BOOL dwResult =FALSE;
cclose();
__try{
if (m_comName ==_T( "")|| m_comName .GetLength ()<1)
__leave;
m_comName.Insert (0,_T( "\\\\.\\" ));
m_comName.MakeUpper ();

hFileHandle =CreateFile ( m_comName ,GENERIC_WRITE | GENERIC_READ,0,0, OPEN_EXISTING ,dwFlagsAndAttributes/* |FILE_FLAG_OVERLAPPED*/,0);
getErrors();
/* EscapeCommFunction(hFileHandle, SETDTR);*/
if (hFileHandle == INVALID_HANDLE_VALUE )
__leave;
dwResult=TRUE ;
}
__finally
{
if (!dwResult ||hFileHandle== INVALID_HANDLE_VALUE )
{
Message(_T ("打开端口失败 "));
}
}
return dwResult ;
}

HANDLE CreatePort:: getHandle()
{

return hFileHandle ;
}
*/
/************************************************************************/
BOOL CreatePort:: setControlCommState (LPDCB lpDCB)
{

if (lpDCB ==NULL)
{
DCB dcb ;
if (GetCommState (hFileHandle,& dcb))
{
dcb.DCBlength =sizeof( DCB);
dcb.BaudRate =CBR_9600;
dcb.ByteSize =8;

dcb.StopBits =TWOSTOPBITS;
dcb.fParity =FALSE;
dcb.Parity =NOPARITY;
/* dcb.fDsrSensitivity*/
dcb.fDtrControl =DTR_CONTROL_ENABLE;
return SetCommState ( hFileHandle,& dcb );
}
getErrors();
}
else
{
return SetCommState ( hFileHandle, lpDCB );
}
return FALSE ;
}

BOOL CreatePort:: writer( const char * cs, LPOVERLAPPED lpOverlapped )
{
BOOL dwResult =FALSE;
dwError=0;
DWORD dwSize =0;
DWORD csLength =strlen( cs);
__try
{
dwResult=WriteFile (hFileHandle, cs ,csLength ,&dwSize , lpOverlapped);
getErrors();
//FlushFileBuffers(hFileHandle);
if(!dwResult )
__leave;

if (dwError >0)
__leave;
if (csLength !=dwSize)
__leave;
}
__finally{
if (!dwResult )
{
getErrors();
}
}
clearError();
PurgeComm(hFileHandle ,PURGE_TXCLEAR);
getErrors();
return FALSE ;
}

void CreatePort:: cclose()
{
BOOL dwbstr =FALSE;
if (hFileHandle)
{
CloseHandle(hFileHandle);
hFileHandle=NULL;
}
// __try
// {
// if (hFileHandle !=INVALID_HANDLE_VALUE)
// {
//
// if (EscapeCommFunction (hFileHandle, CLRDTR))
// {
// setComTimeout();
// dwbstr= clearBuffer ();
// dwbstr=CloseHandle (hFileHandle );
// hFileHandle=INVALID_HANDLE_VALUE ;
//
// }
// }
// }
// __except(EXCEPTION_EXECUTE_HANDLER ) {
// getErrors();
// MessageBeep(MB_OK );
// }
}
CString CreatePort:: getComName() const
{
return m_comName ;
}
void CreatePort:: setComName(CString val)
{
m_comName=val ;
}

BOOL CreatePort:: reader(LPVOID lpbuffer ,LPOVERLAPPED lpOverlapped)
{
BOOL dwbool =FALSE ;
dwError=0;
DWORD i =0;
DWORD nNumberOfBytesToRead =MAX_PATH;
DWORD NumberOfBytesRead =0;
DWORD EvtMask =0;
// DWORD EvtMask =0;
clearError();
i=GetTickCount ();
while(!dwbool )
{
//clearError();
if (i +200<GetTickCount())
{
dwbool=TRUE;
}
}
waitCommMask(&EvtMask,lpOverlapped);
WaitForSingleObject(lpOverlapped->hEvent,100);
if (cbInQue>0)
{
dwbool =ReadFile ( hFileHandle, lpbuffer ,MAX_PATH ,&NumberOfBytesRead ,lpOverlapped );
}

getErrors();
return dwbool ;
}

BOOL CreatePort:: clearError()
{
//(CE_BREAK|CE_MODE |CE_TXFULL| CE_IOE|CE_OVERRUN |CE_RXOVER)
COMSTAT comstat ;
dwError=0;
ZeroMemory(&comstat ,sizeof( COMSTAT));
if (ClearCommError (hFileHandle,& dwError, &comstat ))
{
cbInQue=comstat .cbInQue;
cbOutQue=comstat .cbOutQue ;
if (dwError ==COM_ERROR)
{
cclose();
Message(_T ("端口断开 "));
}
getErrors();
}
return FALSE ;
}

DWORD CreatePort:: getcbOutQue()
{
return cbOutQue ;
}
DWORD CreatePort:: getcbInQue()
{
return cbInQue ;
}
BOOL CreatePort:: clearBuffer()
{
return PurgeComm (hFileHandle, PURGE_RXCLEAR |PURGE_TXCLEAR |PURGE_RXABORT |PURGE_TXABORT);
}
BOOL CreatePort:: setCommEvent(DWORD dwEvtMask )
{

return SetCommMask ( hFileHandle, dwEvtMask );// ​函数设置 COM口的设备控制块
}


BOOL CreatePort:: waitCommMask(LPDWORD lpEvtMask , LPOVERLAPPED lpOverlapped )
{
return WaitCommEvent (hFileHandle, lpEvtMask ,lpOverlapped );
}

BOOL CreatePort:: setComTimeout()
{
COMMTIMEOUTS TimeOuts ={0};
if (GetCommTimeouts (hFileHandle,& TimeOuts))
{
TimeOuts.ReadIntervalTimeout =500;//500//注释的时间比较稳定
TimeOuts.ReadTotalTimeoutMultiplier =10;//100
TimeOuts.ReadTotalTimeoutConstant =50;//500
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier =100;
TimeOuts.WriteTotalTimeoutConstant =500;
if (SetCommTimeouts (hFileHandle,& TimeOuts))
{
return TRUE ;
}
}
return FALSE ;
}

void CreatePort:: setAsynchronous()
{
dwFlagsAndAttributes =FILE_FLAG_OVERLAPPED;
}

void CreatePort:: getErrors()
{
dwError=0;
dwError=GetLastError();
if (dwError>0&& dwError!=997&&dwError ==1453)
{
m_ErrorName.Empty ();
m_ErrorName.Format (_T( "错误%d"), dwError);
Message(m_ErrorName );
}
}


主体代码如上
...全文
402 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35903100 2016-11-03
  • 打赏
  • 举报
回复
我初始化只有数据长只有7位
qq_35903100 2016-11-03
  • 打赏
  • 举报
回复
我读回字节的高8位读不回来1,如本应是0x0a,但读回的是0x02,是那的问题呢
qq_35903100 2016-11-03
  • 打赏
  • 举报
回复
楼主你是怎样解决的呢
赵柒 2014-08-27
  • 打赏
  • 举报
回复
我想我差不多找到原因了 应该是MODEL通信与USB通信问题,我找一找资料 查看下两者通信缓冲区是如何创建
fronz 2014-08-27
  • 打赏
  • 举报
回复
从现象看是,你的串口初始化有问题。波特率等参数设定不当或未设定。
赵柒 2014-08-26
  • 打赏
  • 举报
回复
引用 4 楼 Idle_ 的回复:
[quote=引用 3 楼 zhaoweng77 的回复:] 再次通信就是失败的 但是写入是每次都成功的 可以输入控制指令 至少返回值得时候 必须用其他串口工具打开后才能进行正常通信读取数据
看起来是打开端口的input缓冲区失效了(因为远端断开的原因)。 需要关闭端口再重新打开才行[/quote] input缓冲区失效,那为什么其他串口工具读取此缓冲区是有效的 为什么input缓冲区会失效,关闭端口在重新打开还是不行 ,需要其他工具打开后然后关闭端口,才能使用本程序正常读写
阿呆_ 2014-08-26
  • 打赏
  • 举报
回复
引用 3 楼 zhaoweng77 的回复:
再次通信就是失败的 但是写入是每次都成功的 可以输入控制指令 至少返回值得时候 必须用其他串口工具打开后才能进行正常通信读取数据
看起来是打开端口的input缓冲区失效了(因为远端断开的原因)。 需要关闭端口再重新打开才行
赵柒 2014-08-24
  • 打赏
  • 举报
回复
再次通信就是失败的 但是写入是每次都成功的 可以输入控制指令 至少返回值得时候 必须用其他串口工具打开后才能进行正常通信读取数据
赵柒 2014-08-24
  • 打赏
  • 举报
回复
关闭设备后 重新进行开启设备 通信
阿呆_ 2014-08-24
  • 打赏
  • 举报
回复
我没理解这个逻辑: 你都关闭设备了还希望读什么?
RFID读卡模块RC522串口读写器13.56mhz ic卡设计射频模块串口文档资料+Rc522Manager上位机API工具软件 数据包: 1.头:7F 2.命令字节:1 3.数据字节:不定 4.尾:F7/55 0111 1111 --7F 头 XXXX XXXX --命令字节 数据字节 0111 1111 --F7 尾 命令字节: 函数选择 XXXX XXXX 函数选择 command 说明: 0000:PcdReset(void) //复位 0001:PcdAntennaOn(void) //天线开 0010:PcdAntennaOff(void) //天线关 0011:PcdRequest(unsigned char req_code,unsigned char *pTagType) //寻卡 0100:PcdAnticoll(unsigned char *pSnr) //防冲撞 0101:PcdSelect(unsigned char *pSnr) //卡片选择 0110:PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) //验证卡片密码 0111:PcdRead(unsigned char addr,unsigned char *pData) //读取数据 1000:PcdWrite(unsigned char addr,unsigned char *pData) //写入数据 1001:PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue); //扣款充值 1010:char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr); //备份钱包 1011:PcdHalt(void) //停止使用 1010~1111:预留 函数说明: 1.PcdRequest : req_code[IN]:寻卡方式 0x52 = 寻感应区内所有符合 14443A 标准的卡 0x26 = 寻未进入休眠状态的卡 pTagType[OUT]:卡片类型代码 0x4400 = Mifare_UltraLight 0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire 2.PcdAnticoll:防冲撞。pSnr:卡片序列号。 3.PcdSelect:卡片选择。pSnr:卡片序列号。 4.PcdAuthState:验证卡片密码。 auth_mode[IN]: 密码验证模式 0x60 = 验证 A 密钥 0x61 = 验证 B 密钥 addr[IN]:块地址 pKey[IN]:密码 pSnr[IN]:卡片序列号 5.PcdRead:addr[IN]:块地址 pData[OUT]:读出数据,16 字节 6.PcdWrite:addr[IN]:块地址 pData[IN]:写入的数据,16 字节 7.PcdValue: dd_mode[IN]命令字 0xC0 = 扣款 0xC1 = 充值 addr[IN]钱包地址 pValue[IN] 4 字节增减值,低位在前。 8.PcdHalt:停止使用。 函数参数 data 说明: 0000:PcdReset //复位 //无输入 0001:PcdAntennaOn //天线开 //无输入 0010:PcdAntennaOff //天线关 //无输入 0011:PcdRequest //寻卡 //1 字节寻卡方式 0100:PcdAnticoll //防冲撞 //无输入 0101:PcdSelect //卡片选择 //4 字节卡串口号 0110:PcdAuthState //验证卡片密码 //1 字节模式,1 字节块地址,6 字节密码,4 字节串口号 0111:PcdRead //读取数据 //1 字节地址 1000:PcdWrite //写入数据 //1 字节地址,16 字节数据 1001:PcdValue //扣款充值 //1 字节模式,1 字节地址,4 字 节金额 1010:PcdBakValue //备份钱包 //1 字节源地址,1 字节目标地址 1011:PcdHalt //停止使用 //无输

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧