读串口为什么只能读到一个数据

fishly_0 2008-10-17 09:03:58
我通过串口读取一个设备发出来的数据,0xaa,......0xbb, 数据总是以0xaa开头,0xbb结束的。
我用ReadFile进行阻塞式读取,不知道为什么,读取到的数据总是只有一个字节,就是0xaa,其他的任何字节都读取不到,我用串口调试助手看设备发出的数据,确实是完整的一帧,不知道我的程序哪里有问题,还请大家帮忙分析下,调试状态下就是dwRead=1,难道阻塞式不能这样用? 不知道为什么。。。。。。

while (1)
{
if( WAIT_OBJECT_0==WaitForSingleObject(m_hEvtQuit,0) )
{
TRACE("Quit Com Read Thread\n");
break;
}

DWORD dwRead = 0;
DWORD dwWrite = 0;
BOOL bWrite =false;
BOOL bRead = false;
byte buf[1024] = {0};

bRead = ReadFile(m_hPort,buf,sizeof(buf),&dwRead,NULL);
if (bRead)
{
TRACE("Read %d chars\n",dwRead);
ShowBuf(buf,dwRead);
}

}
...全文
526 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
捕鲸叉 2009-04-30
  • 打赏
  • 举报
回复
VC带了一个SDK的例子叫TTY,就是串口通讯的,你把它的代码看明白,再和你的代码比较一下,看能否查清问题所在
snowflame 2009-03-16
  • 打赏
  • 举报
回复
这样read线程会不会死掉啊?
加个Sleep(100)试试看
Pipi0714 2008-10-30
  • 打赏
  • 举报
回复
12楼说的有道理,但是不全对sizeof(buf)是4而不是1


你这么写代码有问题不可能项目用到的代码好好照照网上很多串口通讯的代码
天高云淡 2008-10-28
  • 打赏
  • 举报
回复
将打开和设置串口的代码贴出来看看……
ilovedrv 2008-10-25
  • 打赏
  • 举报
回复
网上由一个很有名的串口类 cnComm,基本上能实现所有串口的功能,很好用
http://blog.csdn.net/wujian53/category/336981.aspx
vcf_reader 2008-10-24
  • 打赏
  • 举报
回复
楼上正解
dirdirdir3 2008-10-23
  • 打赏
  • 举报
回复
bRead = ReadFile(m_hPort,buf,sizeof(buf),&dwRead,NULL);

buf是char*吧,sizeof(buf)就是1了,试试
bRead = ReadFile(m_hPort,buf,128,&dwRead,NULL);
一条晚起的虫 2008-10-20
  • 打赏
  • 举报
回复
还有,按照6楼的方法,设置一下串口超时
参数可以设的大一点。
一条晚起的虫 2008-10-20
  • 打赏
  • 举报
回复
//如果只能读到一次的话,代码改成以下,看看是什么问题。
while(1)
{
if(ReadFile(m_hPort,buf,sizeof(buf),&dwRead,NULL) )
{
TRACE("Read %d chars\n",dwRead);
}
else
{
DWORD dwError = GetLastError();
TRACE("Error number: %d\n", dwError);
}
}
fishly_0 2008-10-17
  • 打赏
  • 举报
回复
多谢大家的回复!
fishly_0 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zgl7903 的回复:]
循环读看看是什么结果
while(1)
{
if( ReadFile(m_hPort,buf,sizeof(buf),&dwRead,NULL) )
{
TRACE("Read %d chars\n",dwRead);
ShowBuf(buf,dwRead);
}
else
break;
}
[/Quote]

我在调试模式下,运行ReadFile时,会一直阻塞,当设备有数据送过来时,ReadFile就返回了,然后dwRead=1,读取到的数据就只有一个0xaa,其他就再也没有数据读取到了,直到设备发下一条数据过来。
blueink_200451 2008-10-17
  • 打赏
  • 举报
回复
有可能设置的超时有问题。
ddszhan 2008-10-17
  • 打赏
  • 举报
回复
应该是设置超时有问题吧。
改变一下超时的设置,试一试。
COMMTIMEOUTS CommTimeouts;
CommTimeouts.ReadIntervalTimeout = 1000;
CommTimeouts.ReadTotalTimeoutMultiplier = 10;
CommTimeouts.ReadTotalTimeoutConstant = 10;
CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
CommTimeouts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(hComm, &CommTimeouts);
zgl7903 2008-10-17
  • 打赏
  • 举报
回复
循环读看看是什么结果
while(1)
{
if( ReadFile(m_hPort,buf,sizeof(buf),&dwRead,NULL) )
{
TRACE("Read %d chars\n",dwRead);
ShowBuf(buf,dwRead);
}
else
break;
}
fishly_0 2008-10-17
  • 打赏
  • 举报
回复
串口精灵是可以读取到完整的数据的,应该是我程序的问题,不知道是不是哪里的设置有问题。
fishly_0 2008-10-17
  • 打赏
  • 举报
回复
就算超时设置有问题,应该也不会总是只能读到一个字节?而且总是帧头。。。晕
dch4890164 2008-10-17
  • 打赏
  • 举报
回复
下载一个串口调试精灵,监视一下看是否能正常地收发
如果不能正常地收发有可能是设备问题
如果能的话就应当是你的程序问题了
jameshooo 2008-10-17
  • 打赏
  • 举报
回复
代码貌似没有问题。有可能设置的超时有问题。

2,640

社区成员

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

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