C++代码:
hcom = CreateFile(_T("COM3"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL, NULL);
if (hcom == INVALID_HANDLE_VALUE)
{
return;
}
SetupComm(hcom, 1024, 1024);
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout = 1000;
TimeOuts.ReadTotalTimeoutMultiplier = 5;
TimeOuts.ReadTotalTimeoutConstant = 50;
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier = 500;
TimeOuts.WriteTotalTimeoutConstant = 2000;
SetCommTimeouts(hcom, &TimeOuts); //设置超时
DCB dcb;
GetCommState(hcom, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = TWOSTOPBITS;
SetCommState(hcom, &dcb);
PurgeComm(hcom, PURGE_TXCLEAR | PURGE_RXCLEAR);
char str[100];
DWORD wCount=0;//读取的字节数
BOOL bReadStat=false;
bReadStat = ReadFile(hcom, str, 100, &wCount, NULL);
if (!bReadStat)
{
MessageBox(_T("读串口失败!"));
return;
}
调试图片:
VS2013 C++串口编程,接收刷卡器数据,调试显示字符串中的字符无效
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答
- mainidea 2016-05-24 10:18关注
你试试我用的
static HANDLE hCom = NULL;
static OVERLAPPED m_osRead;
static OVERLAPPED m_osWrite;
static DCB dcb;#define BAUD_RATE 9600
int com_open( int comindex )
{
char comname[8];memset(comname,0, sizeof(comname)); sprintf(comname,"COM%d", comindex); hCom = CreateFileA(comname, GENERIC_READ|GENERIC_WRITE, //允许读写 0, //值必须为0,表示不将串口与其他应用程序共享 NULL, // no security attrs OPEN_EXISTING, // 指定如何打开文件,在打开设备(串口是一种设备)时,此参数必须指定为OPEN_EXISTING FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //指定文件属性及相关标志,但是对于串行口,唯一有意义的设置是FILE_FLAG_OVERLAPPED或0 NULL); if( hCom == (HANDLE)-1 ) { return 0; } GetCommState(hCom, &dcb ); //读串口原来的参数设置 dcb.BaudRate = BAUD_RATE; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT ; dcb.fBinary = TRUE; dcb.fParity = FALSE; SetCommState( hCom, &dcb ); //串口参数配置 SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型 SetupComm( hCom, 1024,1024) ; //设置输入、输出缓冲区的大小 PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR|PURGE_RXCLEAR);//清干净输入、输出缓冲区 COMMTIMEOUTS TimeOuts; //设置读超时 TimeOuts.ReadIntervalTimeout=1; TimeOuts.ReadTotalTimeoutMultiplier=1; TimeOuts.ReadTotalTimeoutConstant=1; //设置写超时 TimeOuts.WriteTotalTimeoutMultiplier=1; TimeOuts.WriteTotalTimeoutConstant=1; SetCommTimeouts(hCom,&TimeOuts); //设置超时 memset(&m_osRead,0,sizeof(OVERLAPPED)); m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); memset(&m_osWrite,0,sizeof(OVERLAPPED)); m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //check bool ret = CheckConnect(300); if( ret <= 0 ) { CloseHandle(hCom); hCom = NULL; return 0; } return 1;
}
int ReceiveData( unsigned char *buff_Receive )
{
COMSTAT ComStat;
DWORD dwErrorFlags;
DWORD dwBytesRead=1024;//读取的字节数
BOOL bReadStat=FALSE;ClearCommError(hCom,&dwErrorFlags,&ComStat); if(!ComStat.cbInQue) return 0; dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue); bReadStat=ReadFile(hCom,buff_Receive,dwBytesRead,&dwBytesRead,&m_osRead); if(!bReadStat) { if(GetLastError()==ERROR_IO_PENDING) //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作 { WaitForSingleObject(m_osRead.hEvent,10); //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟 //当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号 } } // PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); return dwBytesRead;
}
解决 无用评论 打赏 举报
悬赏问题
- ¥15 求差集那个函数有问题,有无佬可以解决
- ¥15 【提问】基于Invest的水源涵养
- ¥20 微信网友居然可以通过vx号找到我绑的手机号
- ¥15 寻一个支付宝扫码远程授权登录的软件助手app
- ¥15 解riccati方程组
- ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
- ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
- ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
- ¥50 树莓派安卓APK系统签名
- ¥65 汇编语言除法溢出问题