手机GPS串口读到数据的问题.有经验的兄台帮我看看程序那里有问题,十分感谢...

dzq138 2009-10-29 11:13:58
困惑的是:
GetCommState(m_hComm,&commParam) //这里执行不成功,GetLastError可以看到.返回值为21.设备未就绪。
跳过去.
在读数据时
PurgeComm(ceSeries->m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR );
SetCommMask (ceSeries->m_hComm, EV_RXCHAR );

WaitCommEvent(ceSeries->m_hComm,&evtMask,0);//这里执行也不成功,读不到状态的变化.理所当然evtMask也不有值返回.
因此if (evtMask & EV_RXCHAR) 也没有这个状态..

但:
ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
willReadLen = cmState.cbInQue ; //这里有值噢!!!
ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0); //这里能读到数据噢..困惑呀....

为什么会这样呢?
GetCommState和WaitCommEvent都不能执行.
但能读到数据.........
所以现在好困惑这样的程序到底能不能用.....
有经验的兄台帮我看看程序那里有问题,十分感谢...





//打开COM4口代码
DCB commParam;
commParam.DCBlength = sizeof(DCB);
TCHAR szPort[15];
COMMTIMEOUTS CommTimeOuts;
// 已经打开的话,直接返回
if (m_hComm != INVALID_HANDLE_VALUE)
{
return TRUE;
}
m_hComm = CreateFile (L"COM4:",GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,0, NULL); //成功
if (m_hComm == INVALID_HANDLE_VALUE)
{
// 无效句柄,返回。
TRACE(_T("CreateFile 返回无效句柄\n"));
return false;
}
//设置串口读写时间
GetCommTimeouts (m_hComm, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
CommTimeOuts.WriteTotalTimeoutConstant = 1000;
if(!SetCommTimeouts( m_hComm, &CommTimeOuts ))
{
TRACE( _T("SetCommTimeouts 返回错误") );
//关闭串口
CloseHandle (m_hComm); //关闭线程

m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
//指定端口监测的事件集
SetCommMask (m_hComm, EV_RXCHAR);
//分配设备缓冲区
SetupComm(m_hComm,512,512);
//初始化缓冲区中的信息
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);

// 得到打开串口的当前属性参数,修改后再重新设置串口。
GetCommState(m_hComm,&commParam); //执行不城功也不理,直接运行一下.

//设置串口参数


//if (!GetCommState(m_hComm,&commParam)) //这里执行不成功,GetLastError可以看到.返回值为21.设备未就绪。
//{
// //关闭串口
// UINT dw = GetLastError();
// CString errstr ;
// //errstr.Format("错误代码为:%d" ,dw);
// //wsprintf(errstr,"错误代码为:%d" ,dw);
// //TRACE(dw);
// TRACE(_T("GetCommState 出错\n"));
// CloseHandle (m_hComm); //关闭线程
// m_hComm = INVALID_HANDLE_VALUE;
// return FALSE;
//
//}

commParam.BaudRate = 9600; //波特率
commParam.fBinary = TRUE; //Win32不支持非二进制串行传输模式,必须为TRUE
commParam.fParity = TRUE; //启用奇偶校验
commParam.fOutxCtsFlow = TRUE; //串行端口的输出由CTS线控制
commParam.fOutxDsrFlow = FALSE; //关闭串行端口的DSR流控制
commParam.fDtrControl = DTR_CONTROL_ENABLE; //启用DTR线
commParam.fDsrSensitivity = FALSE; //如果设为TRUE将忽略任何输入的字节,除非DSR线被启用
//commParam.fTXContinueOnXoff = TRUE; //当为TRUE时,如果接收缓冲区已满且驱动程序已传送XOFF字符,将使驱动程序停止传输字符
commParam.fTXContinueOnXoff = FALSE;
commParam.fOutX = FALSE; //设为TRUE指定XON/XOFF控制被用于控制串行输出
commParam.fInX = FALSE; //设为TRUE指定XON/XOFF控制被用于控制串行输入
commParam.fErrorChar = FALSE; //WINCE串行驱动程序的默认执行将忽略这个字段
commParam.fNull = FALSE; //设为TRUE将使串行驱动程序忽略收到的空字节
commParam.fRtsControl = RTS_CONTROL_ENABLE; //启用RTS线
commParam.fAbortOnError = FALSE; //WINCE串行驱动程序的默认执行将忽略这个字段
commParam.ByteSize = 8; //每字节的位数
commParam.Parity = NOPARITY; //无奇偶校验
commParam.StopBits = ONESTOPBIT; //每字节一位停止位

//设置串口参数
if (!SetCommState(m_hComm, &commParam))
{
TRACE(_T("SetCommState error"));
//关闭串口

CloseHandle (m_hComm); //关闭线程
m_hComm = INVALID_HANDLE_VALUE;
return FALSE;
}
困惑的是:




//设置端口上指定信号的状态
// SETDTR: 发送DTR (data-terminal-ready)信号
// SETRTS: 发送RTS (request-to-send)信号

EscapeCommFunction (m_hComm, SETDTR);
EscapeCommFunction (m_hComm, SETRTS);


//创建串口读数据监听线程
m_hReadThread = CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);


//下面是线程中的程序.


CCESeries *ceSeries = (CCESeries*)lparam; //带进来的实例,也就是ceSeries->m_hComm就是COM口句柄.

DWORD evtMask;
BYTE * readBuf = NULL;//读取的字节
DWORD actualReadLen=0;//实际读取的字节数
DWORD willReadLen;

DWORD dwReadErrors;
COMSTAT cmState;
OVERLAPPED ovread ; //Windows CE不支持Windows下常用的串行通信重叠I/O方式(OVERLAPPED)
//http://www.yctek.com/2009/0114/19.html

// 清空缓冲,并检查串口是否打开。
ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE);


//清空串口
//PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );
PurgeComm(ceSeries->m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR );
SetCommMask (ceSeries->m_hComm, EV_RXCHAR );//| EV_CTS | EV_DSR ); //设置事件掩模来监视指定通信端口上的事件
//memset( &ovread, 0x00, sizeof(OVERLAPPED) ) ;
//ovread.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL) ;
while (TRUE)
{

PurgeComm(ceSeries->m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR );
SetCommMask (ceSeries->m_hComm, EV_RXCHAR );

//if (WaitCommEvent(ceSeries->m_hComm,&evtMask,&ovread)) //不知为什么这个执行不成功,所以去除了.
//if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
//{
WaitCommEvent(ceSeries->m_hComm,&evtMask,0); //只好直接执行啦.根本就不会返回EV_RXCHAR 事件
//SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
//表示串口收到字符
//if (evtMask & EV_RXCHAR) //根本就不会返回EV_RXCHAR 事件,所以也就只好去掉啦.....
//{
ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
willReadLen = cmState.cbInQue ; //奇怪的是这里有数据噢......有数据,那就去读吧.....
if (willReadLen <= 0)
{
continue;
}
willReadLen=willReadLen>1024 ? 1024 : willReadLen;

//分配内存
readBuf = new BYTE[willReadLen];
ZeroMemory(readBuf,willReadLen); //填充内存
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0); //这里竟能读到噢..困惑呀....

//如果读取的数据大于0,
if (actualReadLen>0)
{
//触发读取回调函数
if (ceSeries->m_OnSeriesRead)
{
ceSeries->m_OnSeriesRead(ceSeries->m_pOwner,readBuf,actualReadLen);
}
}

//释放内存
delete[] readBuf;
readBuf = NULL;
//}
/*}
else
{
int oooerr= GetLastError();
DWORD dwErrors;
COMSTAT comStat;
memset(&comStat,0,sizeof(comStat));
ClearCommError(ceSeries->m_hComm,&dwErrors,&comStat);
continue;
}*/
//如果收到读线程退出信号,则退出线程
if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
{
break;
}
}
return 0;




...全文
265 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzq138 2011-03-30
  • 打赏
  • 举报
回复
但会内存泄漏....
十来秒就少4096字节....
一条晚起的虫 2009-11-06
  • 打赏
  • 举报
回复
// 是的,直接ReadFile()
dzq138 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lfchen 的回复:]
// CE不支持串口重叠方式。
// 用同步方式即可。
[/Quote]

也就是直接读就可以啦..可以这么理解吧...
newtonnl 2009-11-03
  • 打赏
  • 举报
回复
是不是因为Windows CE不支持Windows下常用的串行通信重叠I/O方式
而导致WaitCommEvent返回值永远都是FALSE呢?且得到GetLastError错误码为120 此功能只被此系统支持。

如果真是这样,那应如解决?

用同步方式打开串口,再使用回调函数即可。你在csdn搜索下有很多ce下的程序可供参考,都是用同步方式打开,回调函数显示的
一条晚起的虫 2009-11-03
  • 打赏
  • 举报
回复
// CE不支持串口重叠方式。
// 用同步方式即可。
dzq138 2009-10-30
  • 打赏
  • 举报
回复
是不是因为Windows CE不支持Windows下常用的串行通信重叠I/O方式
而导致WaitCommEvent返回值永远都是FALSE呢?且得到GetLastError错误码为120 此功能只被此系统支持。

如果真是这样,那应如解决?
zoulie 2009-10-29
  • 打赏
  • 举报
回复
UP,太长了
代码转载自:https://pan.quark.cn/s/a4b39357ea24 基于LSTM三分类的文本情感分析 背景介绍 文本情感分析作为NLP的常见任务,具有很高的实际应用价值。 本文将采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种情感的分类器。 本文的目的是快速熟悉LSTM做情感分析任务,所以本文提到的只是一个baseline,并在最后分析了其优劣。 对于真正的文本情感分析,在本文提到的模型之上,还可以做很多工作,以后有空的话,笔者可以再做优化。 理论介绍 RNN应用场景 RNN相对于传统的神经网络,它允许我们对向量序列进行操作:输入序列、输出序列、或大部分的输入输出序列。 如下图所示,每一个矩形是一个向量,箭头则表示函数(比如矩阵相乘)。 输入向量用红色标出,输出向量用蓝色标出,绿色的矩形是RNN的状态(下面会详细介绍)。 从做到右:(1)没有使用RNN的Vanilla模型,从固定大小的输入得到固定大小输出(比如图像分类)。 (2)序列输出(比如图片字幕,输入一张图片输出一段文字序列)。 (3)序列输入(比如情感分析,输入一段文字然后将它分类成积极或者消极情感)。 (4)序列输入和序列输出(比如机器翻译:一个RNN读取一条英文语句然后将它以法语形式输出)。 (5)同步序列输入输出(比如视频分类,对视频中每一帧打标签)。 我们注意到在每一个案例中,都没有对序列长度进行预先特定约束,因为递归变换(绿色部分)是固定的,而且我们可以多次使用。 word2vec 算法 建模环节中最重要的一步是特征提取,在自然语言处理中也不例外。 在自然语言处理中,最核心的一个问题是,如何把一个句子用数字的形式有效地表达出来? 如果能够完成这一步,句子...
内容概要:本文提出了一种计及N-k安全约束的含光热电站电力系统优化调度模型,旨在提升电力系统在极端故障条件下的安全性和稳定性。模型充分考虑了光热电站的出力特性及其在能量调度中的灵活性,结合N-k安全准则对系统可能发生的多重故障进行校验,确保调度方案在各种潜在故障场景下仍能满足安全运行要求。研究基于IEEE14节点和IEEE118节点标准系统进行仿真验证,利用Matlab编程实现了优化调度算法,评估了模型在不同系统规模下的有效性与适用性。该模型对于促进可再生能源高比例接入背景下的电力系统安全经济运行具有重要意义。; 适合人群:具备电力系统分析、优化调度基础知识的科研人员及工程技术人员,尤其适合从事新能源并网、电力系统安全分析、智能优化算法应用等相关领域研究的研究生与高校教师。; 使用场景及目标:①用于研究含高比例可再生能源的电力系统在多重故障(N-k)场景下的安全约束调度问题;②为光热电站等具备储能能力的新能源电站参与系统调度提供建模参考;③支撑电力系统安全评估与预防控制策略的设计与仿真验证。; 阅读建议:建议读者结合Matlab代码深入理解模型构建过程,重点关注N-k安全约束的数学表达与求解技巧,并可通过调整系统参数或引入其他不确定性因素(如风电、光伏波动性)进一步拓展模型应用场景。

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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