VS2013 C++串口编程,接收刷卡器数据,调试显示字符串中的字符无效

问题描述

VS2013 C++串口编程,接收刷卡器数据,调试显示字符串中的字符无效

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;
}
调试图片:

解决方案

你试试我用的

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;

}

解决方案二:

com_open中的CheckConnect可以直接去掉

时间: 2024-10-21 13:48:38

VS2013 C++串口编程,接收刷卡器数据,调试显示字符串中的字符无效的相关文章

Square引领手机刷卡器的春天

Square创立于2010年,凭借一款插入手机音频口的硬件产品,成为美国炙手可热的明星创业公司."让每个人都可以接收信用卡付款."这是美国知名手机支付公司Square的广告语.目前,Square正带领它的中国门徒一起,迎来手机刷卡器的春天. Square在美国被大量用户中小商户收单 同样的硬件,同样的手机刷卡器,一种在硅谷炙手可热商业模式,却在中国演绎了完全不同的故事. Square的手机刷卡器可以实现个人(主要是个体商户)的信用卡收单,由于美国POS机十分昂贵,这一功能大大减轻了美国

手机刷卡器的商业未来:Square与他的中国门徒

Square在美国被大量用户中小商户收单 同样的硬件,同样的手机刷卡器,一种在硅谷炙手可热商业模式,却在中国演绎了完全不同的故事. "让每个人都可以接收信用卡付款."这是美国知名手机支付公司Square的广告语. 创立于2010年的Square,凭借一款插入手机音频口的硬件产品,成为美国炙手可热的明星创业公司. Square的手机刷卡器可以实现个人(主要是个体商户)的信用卡收单,由于美国POS机十分昂贵,这一功能大大减轻了美国中小商户的负担,使Square得以迅速发展. 4月公布的数据

掌芯宝手机刷卡器 支付通O2O布局加速

有消息称,支付通将在7月底推出其O2O支付的主力产品--掌芯宝手机刷卡器,这是即迷你支付终端(icardpay.com)后的又一新作,是一款通过手机音频口与手机连接的刷卡外设终端,也是支付通公司在O2O支付领域的战略布局型产品,这意味着此公司在该领域的开拓将大大加速.(掌芯宝图片)据了解,支付通是国内从事第三方支付的公司,其母公司海科融通在2011年获得第一批全国收单支付牌照.海科融通副总裁崔毅龙多次在公开场合表示,支付通要做O2O支付领域的专家,围绕O2O整合的方式进行创新,开拓出更多的互联网

手机刷卡器行业怎样一步步成了悲剧?

"只要199元买个手机刷卡器,带上银行卡与手机随身出门,想查余额就查,想给手机冲话费就冲话费,想信用卡还款就还款."--这会是人们梦想中的移动支付吗?当然不是,这是支付厂商的美梦.自去年开始到现在,不断有厂商推出类似硬件,拉卡拉.乐刷.钱袋宝.盒子支付等创业公司纷纷入市,最近的是银联推出了卡乐付.还有公司宣布得到了上千万美元的风投.虽然大家的梦想挺美好,但在现实面前,这样的梦很快就成为一出悲剧.作为业者,就来八一八为什么这事悲剧,以及悲剧是如何诞生的吧.你看到的都是好的但问题是你没看到

中国进入网络购物时代 海航推出“即付宝”手机刷卡器

原标题:中国进入http://www.aliyun.com/zixun/aggregation/7676.html">网络购物时代 海航推出"即付宝"手机刷卡器 国际在线消息(记者 张亚东):日前,中国海航集团旗下的上海即富公司正式推出其谋划已久的"即付宝"手机刷卡器,正式进军移动互联网服务. 据报道,中国已经进入了网络购物时代,中国网购市场规模在去年已经超过了万亿元人民币,仅2012年11月11日的"光棍节"网上促销一天,仅阿里

拉卡拉发布面向个人消费者的手机刷卡器

新京报讯 (记者苏曼丽 实习生楼赛铃)昨天,http://www.aliyun.com/zixun/aggregation/815.html">拉卡拉发布面向个人消费者的手机刷卡器,全面进军个人移动支付市场. 该刷卡器是连接智能手机的外设刷卡终端,个人用户只要在能够正常浏览手机网页网络环境下,均可通过拉卡拉手机刷卡器,实现查询.信用卡还款.个人还贷.转账汇款.个人收账.便民缴费.网购特惠等六大服务.该手机刷卡器售价199元.

亚马逊推信用卡刷卡器拓展线下业务

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 新浪科技讯 北京时间8月13日晚间消息,亚马逊周三推出了自己的信用卡刷卡器Amazon Local Register,进一步向线下市场扩张. 亚马逊这套销售点系统被称为"Amazon Local Register",售价10美元,将与Square和PayPal等对手形成竞争. 与Square 2.75%和PayPal He

手机刷卡器行业前景不明 乐刷欲借微信支付突围

中介交易 SEO诊断 淘宝客 云主机 技术大厅 Square公司以手机刷卡器模式在美国移动支付市场做得风生水起,但其中国同行的日子却过得并不惬意.<每日经济新闻>记者日前获悉,手机刷卡器厂商乐刷推出乐刷APP微信支付功能,试图探索刷卡器行业成长新路径. 目前,引入刷卡器鼻祖Square公司模式的国内厂商,似乎也要面对中美支付环境的差异,乐刷绑定微信支付这条大船,是开辟行业新路径,还是无奈回归大众支付路线? 乐刷开放B端接口 日前,乐刷在其商户版本中新增了微信支付端口,应对缓慢发展的刷卡器行业.

支付宝推出移动支付产品“超级支付”刷卡器

支付宝今日展示了实验性产品"超级支付",刷卡终端与APP配合使用,主要面向商户,收费时可实现银行卡直接向支付宝划款. 新浪科技在支付宝今日的产品沟通会上看到,这款产品分为两部分:插在手机耳机孔.能识别银行卡的刷卡器,和可用在iPhone.iPad上的"超级支付"应用APP. 使用时,付费方将银行卡划过刷卡器,收费方APP识别出该卡卡号.如该卡已与支付宝绑定,则向与支付宝同时绑定的手机号http://www.aliyun.com/zixun/aggregation/1