社区
网络编程
帖子详情
串口通信中比较奇怪的问题:刚开机时串口收不到数据
foxnt
2005-02-02 09:44:54
如题,我用CreateFile和ReadFile来读数据的。一般情况下都能正常通信。但是如果是系统刚启动完,第一次读串口时,怎么也读不到数据,就是ReadFile根本不返回。如果这时候我用WINDOWS带的超级终端来发送,接受一次数据后,程序就一切正常,可读数据了。不知道为什么。
我是用串口线连自己的机器,一头连COM1,一头是USB转串口,模拟COM3。
有谁遇到过这种问题?
...全文
602
22
打赏
收藏
串口通信中比较奇怪的问题:刚开机时串口收不到数据
如题,我用CreateFile和ReadFile来读数据的。一般情况下都能正常通信。但是如果是系统刚启动完,第一次读串口时,怎么也读不到数据,就是ReadFile根本不返回。如果这时候我用WINDOWS带的超级终端来发送,接受一次数据后,程序就一切正常,可读数据了。不知道为什么。 我是用串口线连自己的机器,一头连COM1,一头是USB转串口,模拟COM3。 有谁遇到过这种问题?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
inpriser
2005-03-23
打赏
举报
回复
连接串口2,3针脚试试先,看看是不是由于USB引起
mousefj
2005-03-23
打赏
举报
回复
我的一段成功代码供参考
BOOL CComiotestDlg::OpenConnect()
{
m_hTermWnd=GetSafeHwnd();
if(m_bConnect)
return FALSE;
hCom=CreateFile("COM1",//文件名
GENERIC_READ|GENERIC_WRITE, // 允许读和写
0, // 独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, // 重叠方式
NULL
);
if(hCom == INVALID_HANDLE_VALUE)
{
dwError=GetLastError( );
return FALSE;
// 处理错误
}
SetupComm(hCom,1024,1024 ); //缓冲区的大小为1024
//清除缓冲区
PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
//超时的建立
TimeOuts. ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=5000;
SetCommTimeouts(hCom, &TimeOuts); // 设置超时
//设置事件触发方式
SetCommMask(hCom,EV_RXCHAR);
if(ConfigConnect())
{
m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,
0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
if(m_pThread==NULL)
{
CloseHandle(hCom);
return FALSE;
}
else
{
m_bConnect=TRUE;
m_pThread->ResumeThread(); // 恢复线程运行
}
}
else
{
CloseHandle(hCom);
return FALSE;
}
}
BOOL CComiotestDlg::ConfigConnect()
{
DCB m_dcb;
if(!GetCommState(hCom, &m_dcb))
return FALSE;
m_dcb.fBinary=TRUE;
m_dcb.BaudRate=m_nBaud; // 波特率
m_dcb.ByteSize=m_nDataBits; // 每字节位数
m_dcb.fParity=TRUE;
switch(m_nParity) // 校验设置
{
case 0:
m_dcb.Parity=NOPARITY;
break;
case 1:
m_dcb.Parity=EVENPARITY;
break;
case 2:
m_dcb.Parity=ODDPARITY;
break;
default:;
}
switch(m_nStopBit) // 停止位
{
case 0:
m_dcb.StopBits=ONESTOPBIT;
break;
case 1:
m_dcb.StopBits=ONE5STOPBITS;
break;
case 2:
m_dcb.StopBits=TWOSTOPBITS;
break;
default:;
}
// 硬件流控制设置
//m_dcb.fOutxCtsFlow=m_nFlowCtrl==1;
//m_dcb.fRtsControl=m_nFlowCtrl==1?
//RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;
// XON/XOFF流控制设置
//m_dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;
//m_dcb.XonChar=XON;
//m_dcb.XoffChar=XOFF;
//m_dcb.XonLim=50;
//m_dcb.XoffLim=50;
m_dcb.fBinary=TRUE;
return SetCommState(hCom, &m_dcb);
}
Sander
2005-03-23
打赏
举报
回复
你读,是用一个线程吗
Practise_Think
2005-03-23
打赏
举报
回复
可以先用一个可靠的串口读写软件来试试,比如串口调试助手等,到底是程序有问题还是系统串口设置有问题,逐个逐个方面来排除!!!
qinxiaogang
2005-03-21
打赏
举报
回复
绝对是没有设置超时结构:
COMMTIMEOUTS commTimeouts; // 串口超时
memset( &commTimeouts, 0, sizeof(COMMTIMEOUTS) );
commTimeouts.ReadIntervalTimeout = MAXDWORD; // 读立即返回
::SetCommTimeouts( m_hComm, &commTimeouts );
oyljerry
2005-03-21
打赏
举报
回复
先判断是程序问题,还是硬件转换问题
sandboy2002
2005-03-21
打赏
举报
回复
http://www.blindpoint.net/bbs/ShowForum.asp?forumid=7
red-fly
2005-02-07
打赏
举报
回复
GetCommState( m_ComportHandle, &m_dcb );
m_dcb.BaudRate = STRTOINT(m_BAUDRATE);
m_dcb.ByteSize = STRTOINT(m_BYTESIZE);
m_dcb.fParity = STRTOINT(m_PARITY);
m_dcb.StopBits = STRTOINT(m_STOPBITS);
--------------------------------------------------------------------
这里,对dcb的每个成员附值,肯定是有部分没有初始化,所以你在GetCommState时,其中的一些成员没有初始化,或者初始化的内容和你的不一样,但你却只对其中的4个成员初始化了
cuitcir
2005-02-04
打赏
举报
回复
可能缺少这几句
...
if(!SetupComm(CommHandle, 4096, 4096))
{
...
}
...
if(!SetCommTimeouts( CommHandle, &commtimeouts ))
{
...
}
PurgeComm(CommHandle, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR) ;
狂放之歌
2005-02-04
打赏
举报
回复
但是如果是系统刚启动完,第一次读串口时,怎么也读不到数据,就是ReadFile根本不返回。如果这时候我用WINDOWS带的超级终端来发送,接受一次数据后,程序就一切正常,可读数据了。
不明白,难道WINDOWS带的超级终端 有信号补偿功能?
估计,是你程序的问题.可能再你用串口之前 还需要一个步骤...而这个步骤 WINDOWS带的超级终端替你实现了以后 你的程序才能正常工作..
这个 我没试过..机器太老.:____( 没 USB 55555555555555
shicheng521
2005-02-04
打赏
举报
回复
usb转串口有的时候就是不正常
aiirii
2005-02-04
打赏
举报
回复
USB 轉串口, 似乎有點不平常, 你可以掉轉測試的兩個串口試下
clovexmu
2005-02-04
打赏
举报
回复
当电脑上只有一个串口时如何模拟两个串口的功能 : 拿个9针母头,2,3针脚相连,那么发送出什么就会收到什么。
Sander
2005-02-03
打赏
举报
回复
给code看看
foxnt
2005-02-03
打赏
举报
回复
>>串口参数没有初始化
那要如何正确初始化? 各位看我的代码,每个函数都判断了是否成功,不成功就THROW 一个异常的. 但是所有的都返回了成功啊.
DentistryDoctor
2005-02-03
打赏
举报
回复
USB转串口?有可能是驱动还在加载过程中。
试试两个串口直接通信呢?如果还有问题,说明是你代码的问题。
试试Overlap I/O.
danielzhu
2005-02-03
打赏
举报
回复
串口参数没有初始化,所以在超级终端初始化之后,你的程序,继续默认使用了超级终端的配置参数,所以,你的程序就正常了
danielzhu
2005-02-03
打赏
举报
回复
http://www.gznet.com/gzcity/2005/2005-2-2/505937.html
red-fly
2005-02-03
打赏
举报
回复
那你要判断一下CreateFile是否成功了,不成功的话,读肯定是不行的
foxnt
2005-02-03
打赏
举报
回复
打开串口:
m_ComportHandle = CreateFile( m_ComName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (m_ComportHandle == INVALID_HANDLE_VALUE)
throw CComException(E_UNEXPECTED, GetLastErrorDesc(GetLastError()),
__FILE__, __LINE__);
设置状态:
GetCommState( m_ComportHandle, &m_dcb );
m_dcb.BaudRate = STRTOINT(m_BAUDRATE);
m_dcb.ByteSize = STRTOINT(m_BYTESIZE);
m_dcb.fParity = STRTOINT(m_PARITY);
m_dcb.StopBits = STRTOINT(m_STOPBITS);
if( !SetCommState( m_ComportHandle, &m_dcb ))
{
DWORD errcode = GetLastError();
CloseHandle(m_ComportHandle);
throw CComException(errcode, GetLastErrorDesc(errcode), __FILE__, __LINE__);
}
读数据:
if (!ReadFile(m_ComportHandle, (void*)buf, m_ComBuffer, &readed, NULL))
{
....
}
加载更多回复(1)
彻底解决
串口
数据
误装鼠标的
问题
.rar
彻底解决
串口
数据
误装鼠标的
问题
! 当电脑
开机
如果
串口
有
数据
发来,会被操作系统识别为
串口
鼠标,从而误装驱动,影响鼠标正常工作,本案能彻底解决该
问题
!
Qt 实
时
读
串口
数据
,并将读到的
数据
从网口发送出去
1. 要试试从
串口
读取
数据
2. 将读到的
数据
从网口发送出去 3.
开机
启动 4. 没有界面
大彩
串口
屏如何设置
开机
动画教程.zip
广州大彩
串口
屏开发教程——大彩
串口
屏如何设置
开机
动画
串口
通信
协议的制定方法
串口
通信
协议的制定方法,如何自己定制通信协议
串口
调试助手.zip
串口
助手
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章