为和我在操作串口时,使用ReadFile没有阻塞,而是直接返回TRUE呢?

FLandY1982 2008-01-29 12:04:16
代码段如下..
#define BUF_IO_SIZE 16
unsigned char lpBuf[BUF_IO_SIZE];
DWORD dwReadSize = 0;
memset(lpBuf, 0, BUF_IO_SIZE);
CString str = "COM4";
HANDLE hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
while(1) {
if(hCom != NULL || hCom != INVALID_HANDLE_VALUE)
ReadFile(hCom, lpBuf, BUF_IO_SIZE, &dwReadSize, NULL);
}

在while循环中dwReadSize一直为0且ReadFile返回TRUE.
...全文
388 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
crumpy 2008-01-31
  • 打赏
  • 举报
回复
别的没看出来, 但这行肯定有问题:

if(hCom != NULL || hCom != INVALID_HANDLE_VALUE)


改为:

if(hCom != INVALID_HANDLE_VALUE)
tiger波波 2008-01-31
  • 打赏
  • 举报
回复
我这个应该没问题。你好好检查下,一是用串口调试工具看看有没有数据传上来,而是看看波特率等设置的对不对
FLandY1982 2008-01-31
  • 打赏
  • 举报
回复
to youyingbo
我用你代码测试过的..不行.
tiger波波 2008-01-30
  • 打赏
  • 举报
回复
你CreateFile打开串口的方式跟我不一样,你那个好像是同步的,读一下,什么也没读到,也返回

你完全拿我的试试
knightshenbin 2008-01-30
  • 打赏
  • 举报
回复
你波特率,停止位等等参数都没设置,怎么读啊~。~
FLandY1982 2008-01-30
  • 打赏
  • 举报
回复
To youyingbo:
我测试了下你代码,还是不行
我修改下面语句的超时时间为INFINITE,但依然是直接就返回0也就是WAIT_OBJECT_0,其中dwRead = 0.
dwRes = WaitForSingleObject(Read_OS.hEvent, INFINITE); //设置半秒超时
不知道此代码你在你的机器上测试下来是什么情况.
zhoujianhei 2008-01-29
  • 打赏
  • 举报
回复
先使用 串口调试助手 试试你的com4是否正常?
FLandY1982 2008-01-29
  • 打赏
  • 举报
回复
to zhoujianhei
我把串口初始化的相关操作代码都加上去了,问题依然如故,不知为何会出现此问题....

#define BUF_IO_SIZE 16
unsigned char lpBuf[BUF_IO_SIZE];
DWORD dwReadSize = 0;
memset(lpBuf, 0, BUF_IO_SIZE);
CString str = "\\\\.\\COM4";//"COM4";
HANDLE hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hCom != NULL || hCom != INVALID_HANDLE_VALUE) {
// 设置超时时间参数以及串口参数.
COMMTIMEOUTS CommTimesOuts;
// 读取溢出时间 = 要读取的字节 * 放大因子 + 固定时间
// Bin 码每个BIN 间的时间允许为 30 ms , 在此设定为 100 ms , 超过该时间说明读取完成
CommTimesOuts.ReadIntervalTimeout = 30;
// 时间放大因子
CommTimesOuts.ReadTotalTimeoutMultiplier = 8 ;
// 固定时间,
CommTimesOuts.ReadTotalTimeoutConstant = 100 ;
// 写数据溢出时间 = 要写入的字节 * 放大因子 + 固定时间
CommTimesOuts.WriteTotalTimeoutMultiplier = 2 * CBR_9600 / 115200;
CommTimesOuts.WriteTotalTimeoutConstant = 50;
SetCommTimeouts(hCom, &CommTimesOuts);
DCB dcb;
dcb.DCBlength = sizeof( DCB );
GetCommState(hCom, &dcb );
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
if(!SetCommState(hCom, &dcb)
|| !SetupComm(hCom, 10000, 10000)) // 缓冲区设置
return FALSE;
}
while(1) {
if(hCom != NULL || hCom != INVALID_HANDLE_VALUE)
ReadFile(hCom, lpBuf, BUF_IO_SIZE, &dwReadSize, NULL);
}
FLandY1982 2008-01-29
  • 打赏
  • 举报
回复
to zhoujianhei
我在MFC console application 下面测试的,不行的...依然是返回TRUE并且dwReadSize = 0.
zhoujianhei 2008-01-29
  • 打赏
  • 举报
回复
#define BUF_IO_SIZE 16
unsigned char lpBuf[BUF_IO_SIZE];
DWORD dwReadSize = 0;
memset(lpBuf, 0, BUF_IO_SIZE);
CString str = "\\\\.\\COM4";
HANDLE hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DCB dcb;
... // 设置参数
SetCommState(hCom, &dcb);
while(1) {
if(hCom != NULL || hCom != INVALID_HANDLE_VALUE)
ReadFile(hCom, lpBuf, BUF_IO_SIZE, &dwReadSize, NULL);
}
FLandY1982 2008-01-29
  • 打赏
  • 举报
回复
TO Mackz
lpOverlapped
If hFile was not opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the read operation starts at the current file position and ReadFile does not return until the operation has been completed.
zhoujianhei 2008-01-29
  • 打赏
  • 举报
回复
#define BUF_IO_SIZE 16
unsigned char lpBuf[BUF_IO_SIZE];
DWORD dwReadSize = 0;
memset(lpBuf, 0, BUF_IO_SIZE);
CString str = "\\\\.\\COM4";
HANDLE hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
while(1) {
if(hCom != NULL || hCom != INVALID_HANDLE_VALUE)
ReadFile(hCom, lpBuf, BUF_IO_SIZE, &dwReadSize, NULL);
}
菜牛 2008-01-29
  • 打赏
  • 举报
回复
你最好看看ReadFile最后一个参数的意思。
tiger波波 2008-01-29
  • 打赏
  • 举报
回复
void OpenComm()
{
if(bIfopen)
AfxMessageBox("串口已经打开!");
else
{
hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); //创建串口,异步方式
if (hCom == INVALID_HANDLE_VALUE)
AfxMessageBox("打开串口失败!");
else
{
bIfopen = TRUE;
SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY ); //设置串口事件
SetupComm( hCom, 4096,4096); //设置读写缓冲区大小
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

COMMTIMEOUTS comTimeOut; //设置超时
comTimeOut.ReadIntervalTimeout = 100; //两字符之间最大的延时
comTimeOut.ReadTotalTimeoutMultiplier = 50; //读取每字符间的超时
comTimeOut.ReadTotalTimeoutConstant = 1000; //一次读取串口数据的固定超时
comTimeOut.WriteTotalTimeoutMultiplier = 50; //写入每字符间的超时
comTimeOut.WriteTotalTimeoutConstant = 1000; //一次写入串口数据的固定超时
SetCommTimeouts(hCom,&comTimeOut);

DCB dcb;
GetCommState(hCom, &dcb ); //串口设置
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fBinary = TRUE;
dcb.fParity = FALSE;
SetCommState( hCom, &dcb );
}
}
}

BYTE ReadComm(char* cBuffer, int iReadNum)
{
OVERLAPPED Read_OS;
DWORD dwRead;
DWORD dwRes;

memset(&Read_OS,0,sizeof(OVERLAPPED));
Read_OS.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
if(Read_OS.hEvent == NULL)
return 0x01;

if(!ReadFile(hCom, cBuffer, iReadNum, &dwRead, &Read_OS))
{
if(GetLastError() != ERROR_IO_PENDING)
{
CloseHandle(Read_OS.hEvent);
return 0x02; //连接错误
}
else
{
dwRes = WaitForSingleObject(Read_OS.hEvent, 500); //设置半秒超时
switch(dwRes)
{
case WAIT_OBJECT_0: //消息到达
if (!GetOverlappedResult(hCom, &Read_OS, &dwRead, FALSE))
{
CloseHandle(Read_OS.hEvent);
return 0x02; //连接错误
}
else
{
CloseHandle(Read_OS.hEvent);
return 0; //读取成功
}
case WAIT_TIMEOUT: //超时时间已过
CloseHandle(Read_OS.hEvent);
return 0x04;
default:
{
CloseHandle(Read_OS.hEvent);
return 0x03; //Error in the WaitForSingleObject; abort.This indicates a problem with the OVERLAPPED structure's event handle.
}
}
}
}
else
{
CloseHandle(Read_OS.hEvent);
return 0; //读取成功
}

CloseHandle(Read_OS.hEvent);
return 0;
}
tiger波波 2008-01-29
  • 打赏
  • 举报
回复
有没有数据上来啊?
FLandY1982 2008-01-29
  • 打赏
  • 举报
回复
com4是好的...我用的是USB转串口,难道是这个的问题?

16,472

社区成员

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

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

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