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

0

2个回答

你试试我用的

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;

}

0

com_open中的CheckConnect可以直接去掉

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
VS2013 调试时读取字符串的字符时出错
在 Debug 模式下,VC 会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”; 会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就是 “屯屯屯屯……”。 那么调试器为什么要这么做呢? VC的DEBUG版会把未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是就让取随机值,那是为了方便我们调试程序,如果野指
关于VS2017调试时,字符数组显示"字符串中的字符无效"问题
关于VS2017调试时,字符数组显示"字符串中的字符无效"问题 1.如果已经分配过内存,可能是越界导致的指令错误。 2.可能是字符数组成员的值超出了ASCII码表示范围,导致字符无效 如:arr[1]=0x89; 此时,在调试时,就会显示"字符串中的字符无效". 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown...
VS2013 C++串口编程,接收刷卡器数据,数据中字符串字符无效
c++代码:rn hcom = CreateFile(_T("COM3"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTINGrn , FILE_ATTRIBUTE_NORMAL, NULL);rn if (hcom == INVALID_HANDLE_VALUE)rn rn return;rn rn SetupComm(hcom, 1024, 1024);rn COMMTIMEOUTS TimeOuts;rn //设定读超时rn TimeOuts.ReadIntervalTimeout = 1000;rn TimeOuts.ReadTotalTimeoutMultiplier = 5;rn TimeOuts.ReadTotalTimeoutConstant = 50;rn //设定写超时rn TimeOuts.WriteTotalTimeoutMultiplier = 500;rn TimeOuts.WriteTotalTimeoutConstant = 2000;rn SetCommTimeouts(hcom, &TimeOuts); //设置超时rn DCB dcb;rn GetCommState(hcom, &dcb);rn dcb.BaudRate = 9600;rn dcb.ByteSize = 8;rn dcb.Parity = NOPARITY;rn dcb.StopBits = TWOSTOPBITS;rn SetCommState(hcom, &dcb);rn PurgeComm(hcom, PURGE_TXCLEAR | PURGE_RXCLEAR);rn char str[100];rn DWORD wCount=0;//读取的字节数rn BOOL bReadStat=false;rn bReadStat = ReadFile(hcom, str, 100, &wCount, NULL);rn if (!bReadStat)rn rn MessageBox(_T("读串口失败!"));rn return;rn rn调试图片:rn[img=https://img-bbs.csdn.net/upload/201605/17/1463445944_349402.png][/img]
Linux下的串口编程(FL2440实现串口接收发送)
前面已经了解了串口的基础知识,下面将介绍在Linux下如何编程。以下的程序是,直接串口读,读完写的例程。 串口编程思路: 打开串口,设置波特率,数据位,停止位,奇偶校验位; 读写串口;(直接用read,write函数) 关闭串口。 直接见代码 串口的头文件,先定义一个结构体,含有其串口必备的要设置的数据位,奇偶校验位,停止位,是否连接,波特率,设备名等。 声明串口初始化函数,设置端口...
VS2013 0xCCCCCCCCC 读取字符串的字符时出错
问题描述 相关知识点的补充: 问题描述 在一个函数调用中,使用二级指针作为函数参数,传递一个字符串指针数组,但是在访问的时候,却出现了运行时错误,具体表现为“0xCCCCCCCC 读取字符串的字符时出错”。 第一反应是字符串忘记初始化了,但是一检查不对,我初始化了啊。怎么会出现这种问题,然后通过单步调试发现是传值的二级指针指向的指针数组访问越界了,代码片段如下——...
linux环境下读取串口特定字符串的实现总结
刚刚开始接触串口的时的感觉是懵逼状的,自从用了霸王洗发水后… 不是,不是,题跑偏了。自从深入了解了串口的知识后发现又是一片知识的海洋,当工作中要运用到串口的知识时会感觉到有点迷茫,不过在大神的指点下已经很好的完成了这方面的工作。所以我在今天写这篇文章算是是对我往后工作的一个总结。 一:串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-23
C/C++消除字符串中的无效字符,用于加载配置
字符数组是一个数组,每个元素的值都可以改变。而字符串指针指向的是一个常量字符串,它被存放在程序的静态数据区,一旦定义就不能改变。这是最重要的区别。#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> void trim_space(char* str) { if(!str) retu
QT下写的界面程序,可以实现串口和UDP的字符串和16进制收发
用qt实现的界面程序,实现串口和UDP的字符串和16进制的收发以及qt界面美化的方法。 更详细的介绍及界面展示,请参考笔者博客,在CSDN上搜索“QT学习过程及简单串口和UDP通信demo开发过程及代码分享”。
vs 2013 使用scanf获取输入字符和字符串
在vs2013中,使用scanf会报错,推荐使用scanf_s代替。 1,获取字符 char a; scanf_s("%c", &a, 1); printf("%c\n", a); 注:在scanf_s函数中,必须指定一个获取的字符数,否则,会获取不到值 2,获取字符串 char buf[10]; scanf_s("%s", buf,10); printf("%s\n
让VS调试器正确显示UTF-8字符串
默认的, VC调试器只能正常显示ANSI字符串及UNICODE字符串, 而UTF-8字符串及其他格式则无法显示 这里无需编写插件及修改配置文件,只需要将要显示的字符串拉到Watch中,并在变量后面添加,s8即可显示  -->  同样类型的功能也应该很熟悉 ,数字  将变量拆分为数组显示, 数字是要显示多少位, 此法对const char*这类原始字符串非常有用 ,x
[C/C++]_[初级]_[替换过滤utf8字符串里无效字符]
场景: 1. 分析数据时,获取到的数据是字符串,但是有可能不是正确的完整的utf8字符串,打印出来或输出到文件时表现出来的就是显示乱码. 这时候就需要过滤掉非法字符使utf8字符串能正确显示, 比如把非法字符替换为#
VS2012和2013里scanf_s无法输入字符串的解决方案
今天在VS2012里面使用scanf_s()函数时,发现它不能输入字符和字符串,为了验证是scanf_s的问题还是printf_s的问题,先直接输出字符,如下:int a1=1; float b1=1; char c1='h'; printf_s("a1=%d,b1=%f,c1=%s",a1,b1,c1);结果是这样的 说明printf_s没有问题,如果使用scanf_s()进行输入的
串口通信程序中十六进制格式发送和接收实现
刚刚用MFC编写了一个串口通信程序,
vs2013使用多字节字符,编译出错
提示如上图 解决方法: 下载该网址对应的exe进行安装 官网地址 https://www.microsoft.com/zh-cn/download/details.aspx?id=40770 扫码关注我们:跟着数理化走天下 获得更多的信息哦,一起交流,一起成长哦:微信号:跟着数理化走天下,纯属个人的交流,无盈利目的
VS2013串口通信
水平略低,若有不对请直接指出。 以前接触51的时候就听过串口,但是一直没有机会接触。这一次“炬芯杯”的比赛做一个激光打印机:计算机通过摄像头抓取到人脸,将人脸的数据发送给下位机打印出来,其中计算机和下位机就是通过串口进行通信,那什么是串口通信呢? 串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点串行接口串行接口是通信线路简单,只要一对传输线就可以实现双向通
Linux下串口调试及使用shell编程接收数据
串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是”数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”该标准规定采用一个 2
将串口接收到的字符串转化为数值(包含小数)
串口接收到的一般都为字符串,常见的函数sscanf()只能转化整数型字符串,对于浮点型字符串则不行。 该函数实现将浮点型字符串转化为相应的数值(整数,浮点数据均可)float SPRTODATA(u8 *p) //将字符串转化为数据(包含小数) { u16 i=0,j=0,t=0; double temp=0; for(i=0;i<LEN;i++) {
树莓派_Linux串口编程_实现自发自收
串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用。
【C#】串口传输中文字符
发送: Encoding gb = System.Text.Encoding.GetEncoding(&quot;gb2312&quot;); byte[] bytes = gb.GetBytes(&quot;中文&quot;); serialPort1.Write(bytes, 0, bytes.Length); 接收: int ilen = serialPort1.BytesToRead; byte[]...
c语言中字符串操作常见错误及调试方法
1,字符串中预期的“\0”结束符位置不对,待整理 2,字符串结尾中包含"\n"字符,用printf打印字符串,在打印格式后边添加一个字符看看字符串结尾是否包含回车 3,字符数组的index忘记减1,用眼力仔细看了
VS2012 串口编程
#using using namespace System; using namespace System::IO::Ports; using namespace System::Threading; public ref class PortChat { private: static bool _continue; static SerialPort^ _serialPo
VS2015+MFC+串口通信
前期准备参考:https://blog.csdn.net/qq_20044829/article/details/82902000 在VS2015下通过串口成功之后,移植到MFC上进行串口通信,具体就是通过设置下拉列表选择COM口而不是直接在程序中固定COM口,然后实现数据的发送。 1.新建一个MFC对话框工程,删除中间的框。 2.点击右侧工具箱分别选择l两个按钮控件和ComboBox控...
Linux系统下串口接收数据,部分特殊字符丢失的解决方法 .
最近在linux系统中写了个串口接收程序,发送端依次从0x00~0xFF发送字符,但接收端某些字符老接收不到,分析及其解决方法如下: 一、只接收到数据: 05 06 07 08 09 0a   解决此问题之前我们先看终端I/O的两种输入处理模式: (1) 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求, 终端驱动程序最多返回一行。 (2
解决 vs 出现Error MC3000 给定编码中的字符无效
在 xaml 写中文注释,编译失败 Error MC3000 给定编码中的字符无效
linux串口特殊字符不能接收
最近在linux系统中写了个串口收发程序,通过协议与下位机通讯,期间发现某些字符老接收不到,某些字符被更改,分析及其解决方法如下: 一、只接收到数据: 0D 变成了0A  13收不到   解决此问题之前我们先看终端I/O的两种输入处理模式: (1) 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求, 终端驱动程序最多返回一行。 (2) 非
51单片机串口通信(字符串接收和发送)
转自:http://www.cnblogs.com/weifeng727/category/845655.html #include //------------------串口通信协议-----------------// /* 客户端数据包格式解释(长度恒为15): 例如:A01_fmq_01Off___# A--------数据包的开始标记(可以为A到Z,意味
std::string在vs中调试中不显示数值的问题
如上图所示,通常string字符串里的字符是看的到的,但有时调试中,string的值不可见,说明此字符串里有\0的字符存在,此时需要检查程序逻辑。
20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)
1、新建MFC对话框工程如下 2、给编辑框控件添加变量,其中Edit Box添加Value变量,Button添加Control变量,ID和变量分别为: IDC_EDIT_RXDATA() IDC_EDIT_TXDATA() IDC_BTNOPEN() IDC_BTNSEND() CString m_sRXDATA; CString m_sTXDATA; CButton m_
串口收发字符转换为整数
在下位机中处理来自串口的字符串数组,将其转换为对应的整型变量,这里考虑了正负数两种情况,在VC6.0环境下验证,使用时利用两个子函数即可
IE7提示"无效字符"的问题
前些日子写了一个简单的基于Html的程序,功能简单到就是直接Navigate一个Flash文件(*.swf), 在原先的机器(IE6)上测试没什么问题。可换了新机器后就出问题了,新机器的IE是7.0。总提示“无效字符”。如下图:在google上找到了问题所在,原来在ie7中增加了新的安全设置。打开工具->Internet选项->高级,在其中新增了“允许活动内容在我的计算机上的文件中运行”,勾选
C/C++字符串中出现‘\’的情况
如果在字符串中出现'\',必须要用'\\'来代替举个简单的例子时间限制:1秒 空间限制:65536K 热度指数:511 算法知识视频讲解题目描述    A common typing error is to place the hands on the keyboard one row to the right of the correct position. So &quot;Q&quot; is typed as...
串口使用中断发送字符串,并在LCD显示字符串内容
#include #include"./delay/DELAY.H" #include"./LCD/LCD.h" unsigned char i = 0; unsigned char str[16]; void uart_init() { SCON = 0x50; //设置串口工作模式,打开接受允许 //SM0 = 0 ; SM1 = 1 ; REN
VS2013 Windows API 串口通信编程--多线程异步方式
转载自:blog.csdn.net/mingojiang 1.串口通信基础 提到串口让人想起并口,它们是计算机中两个比较重要的通信方式. 串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占一个固定的时间长,速度慢,但是传输距离远, 有9针和25针两种,是阳插座(插座中有针凸起),目前25针较少使用;Modem\鼠标\USB口\老式摄像头等都是用串口. 并口:把字节的二进
VC++ SerialPort类 串口调试程序vs2013工程
visualstudio2013下的vc++ SerialPort类win32控制台应用程序工程文件
vs2010 wpf 给定编码中的字符无效
今天使用VS2010,创建一个WPF工程,修改一个Title的值为中文字符了,可是没有想到,编译就直接抛出异常,说什“**行**列,给定编码中的字符无效,****”,哎,郁闷难道VS2010不支持中文字符啦? 经过缜密查找,终于知道原来是文件字符集的编码格式出得问题,VS201
C++串口编程实例
在windows程序设计与开发过程中,特别是涉及到开发嵌入式软硬件系统时,往往会涉及到串口编程。网上以及一些书籍上讲解windows下的串口编程知识也挺多的,但我个人觉得,看完书上的知识点有时依然不知道该如何下手开始自己的程序设计和代码编写,许多知识如果能结合着详细的例子往往能够帮助我们学习得更快,所以,在此,我专门为串口编程初学者设计了一个详细的例子,供大家参考和学习。      下面我将自
VS2013无法进入断点进行调试
以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟。昨天调试一个DLL,添加输出信息吧,太麻烦而且不轻易定位,  但设置断点后按“F5”,断点不可用,气泡提示“当前不会命中断点,还没有为该文档加载任何符号。  ”再右键->“位置”->“答应源代码与原始版本不同”,还是不行。77777我还不信了,整它!  后来才发现,“Alt+F7”->“配置属性”->“调试”->“命令”中输入的 ex
Debug 输出字符串 调试信息
使用工具:VC6.0,IDA 当我们要在程序中输出调试信息时,常常以字符串的形式来输出,例如: 1.printf("Some debug information here!\n"); 这段代码在Debug和Release版下都输出调试信息,这不是我们所要的,一般地大家都会添加预编译指令,如下所示: 1.#if _DEBUG   2.printf("Some de
调试时显示:字符串中的字符无效!
缓冲区 是byte类型的,我使用sprintf格式化为char型字符串还是不能输出字符串
串口调试助手-发送数据,按字符或16进制显示接收数据的C#程序
http://www.cnblogs.com/liaoshf/p/5894451.html
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 vs2013微信开发教程 web调试视频教程