串口设置问题!SetCommState函数!

xuefeng_baggio 2010-04-07 06:46:17
各位大侠好,我最近在调试一个串口程序遇到个很奇怪的问题,我在SetCommState串口时总是返回0,也就是设置失败,用GetLastError函数得到是87, 好像是参数错误!很奇怪 我在另一个程序中也是这么设置,而且也是可以通信的,把代码给各位看看!

if ((m_idComDev=CreateFile(strComPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL))==(HANDLE)-1)
{
MessageBox(_T("打开串口失败!"),_T("警告"));
return FALSE;
}

RETAILMSG(1, (_T("[PLCDrv] CPLCDrvDlg::OpenConnection CreateFile com=%d ++++ \r\n"),strComPort));

DCB dcb;
//dcb.DCBlength=sizeof(DCB);
BOOL cc = GetCommState(m_idComDev,&dcb);
dcb.BaudRate = 115200;
dcb.fParity =TRUE;
dcb.fNull = FALSE;
dcb.StopBits = 1;
dcb.Parity = NOPARITY;
dcb.ByteSize = 9;
BOOL bb =SetCommState(m_idComDev,&dcb);
DWORD dw =GetLastError();

现在串口已经打开成功了。但是BOOL bb =SetCommState(m_idComDev,&dcb);一直是0.我调试发现dcd参数也是改变了的!不知道什么原因!还请各位帮我看看这个问题!
...全文
3391 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ahh_Freshmeat 2012-10-18
  • 打赏
  • 举报
回复
我也是遇到了楼主的问题 搜索找到这个帖子的


问题解决了

上面各位说的都对

出现87错误的原因是:DCB设置不完整,详细的DCB设置我上传到CSDN的下载里面了

有需要可以去下载
悟OO道 2011-12-29
  • 打赏
  • 举报
回复

DCB dcb;
if (!GetCommState(m_hCom,&dcb))
{
cout<<"GetCommState fail! Comm close"<
CloseHandle(m_hCom);
return -1;
}
cout<<"GetCommState OK!"<

dcb.DCBlength = sizeof(dcb);
if (!BuildCommDCB("9600,n,8,1",&dcb))//填充DCB的数据传输率、奇偶校验类型、数据位、停止位
{
//参数修改错误,进行错误处理
cout<<"BuileCOmmDCB fail,Comm close!"<
CloseHandle(m_hCom);
return -1;
}
if(SetCommState(m_hCom,&dcb))
{
cout<<"SetCommState OK!"<
}

mltong 2011-05-07
  • 打赏
  • 举报
回复
我遇到另外一个问题:

虽然将DCB的fParity设为1,而且SetCommState()也返回TRUE,但是再GetCommState的时候发现fParity是0。
也就是说,仍然是无检验的……

看网上有不少这样的,不过还没找到答案。
a5630115 2011-01-17
  • 打赏
  • 举报
回复
当DCB用来控制8250时,对ByteSize和StopBits的设置有如下限制:
1、数据位ByteSize必须为5~8位。
2、5个数据位配两个停止位,或者6、7、8个数据位配1.5个停止位都是不正确的设置。
(摘抄至《Visual C++串口通信编程实践》)
另外,有宏定义:
#define ONESTOPBIT 0
#define ONE5STOPBIT 1
#define TWOSTOPBITS 2

所以如果要设置停止位为ONESTOPBIT时,误填成数字1,SetCommState会返回0(错误),GetLastError会返回87(ERROR_INVALID_PARAMETER:无效参数)。
wnqgz 2010-12-13
  • 打赏
  • 举报
回复
我也遇见了和你一样的问题期待高手的回答!!
guopeixin 2010-04-09
  • 打赏
  • 举报
回复
拿串口driver的mdd层调试看看
wjcapple 2010-04-09
  • 打赏
  • 举报
回复
dcb.ByteSize = 9,好像是4-8位,没有九位的
wjcapple 2010-04-09
  • 打赏
  • 举报
回复
dcb.ByteSize = 9,好像是4-8位,没有九位的
xuefeng_baggio 2010-04-09
  • 打赏
  • 举报
回复
这两天一直在测试这段程序,发现很奇怪,SetCommState(),在evc中好像都是返回0 但是我SetCommState()之后又GetCommState()发现dcd是可以改变的,但是我不知道SetCommState()为什么会总是返回0.经过昨天测试 baud在9600——115200串口通信都是正常了。很奇怪!不知道那位大侠有串口程序可以有空测试下看看SetCommState()是不是这样的!
ccuair 2010-04-08
  • 打赏
  • 举报
回复
如果樓主UART是舊的架構(沒有類別),某些dcb設置的ioctl是不支援的
例如IOCTL_SERIAL_SET_QUEUE_SIZE :等~他會直接return false
xuefeng_baggio 2010-04-08
  • 打赏
  • 举报
回复
还是不行,刚才看了下 我在SetCommState之后,再GetCommState发现dcd的值有恢复了!
GARY 2010-04-08
  • 打赏
  • 举报
回复
dcb.StopBits = 1;
改为
dcb.StopBits = 0;
试试
xuefeng_baggio 2010-04-08
  • 打赏
  • 举报
回复
不好意思,dcb.ByteSize = 9;
确实是=8,=9是我测试dcd变量有没有变的!马上按朱工的说法改改看!很奇怪的问题!
GARY 2010-04-07
  • 打赏
  • 举报
回复
BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */
另外,楼主这里:
dcb.StopBits = 1;
设置的停止位是1.5而非1吧?
MSDN里面有一句话
“The use of 5 data bits with 2 stop bits is an invalid combination,
as is 6, 7, or 8 data bits with 1.5 stop bits.”
也就是:
5位数据位与2位停止位的组合
6,7,8位数据位与1.5位停止位的组合
都是invalid的。
总之,楼主仔细看下


GARY 2010-04-07
  • 打赏
  • 举报
回复
可能是楼上所说的问题。
这个情况就是DCB有的成员设置不正确
或者是有的参数组合不允许
仔细看下帮助文档中
DCB的介绍。
大海雪山 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baili35 的回复:]

说不定波特率不支持那么高的.
[/Quote]
波特率没问题吧,
dcb.ByteSize = 9;
不是4-8位么,会不会是这的问题呢
kyzf 2010-04-07
  • 打赏
  • 举报
回复
mark,学习下

帮顶下。
baili35 2010-04-07
  • 打赏
  • 举报
回复
说不定波特率不支持那么高的.

19,519

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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