关于串口通信数据接收失败的问题

fallenbluefire 2011-02-18 10:01:40
那一根数据线,分别连了两台电脑的COM2口
通过发送端向端口写数据
::WriteFile(m_hComDev, leftdata, leftlength,(unsigned long*)&rc, NULL)

再通过接收端从端口接收数据
::ReadFile(m_hComDev, leftdata, leftlength,(unsigned long*)&rc, NULL)

通过打出来的log显示
两台电脑的COM2口打开均成功,
而且发送端发送的数据也成功发送了,rc=10(发送了10个bit的数据)
但是接收端从端口接收的数据为0,一个数据也没接收到

两个端口的属性是:
COM2
速度 9600
数据位 8
校验 无
停止为 1

后来又设置了端口事件驱动,发觉没有等到EV_RXCHAR(数据进入缓冲区)这个事件,不知道是什么原因
不太熟悉串口通信这一块,所以求教
...全文
1862 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuihuo100 2012-07-25
  • 打赏
  • 举报
回复
通过串口与开发板相连,无法正常接收数据。借宝地一观
stock999 2011-02-21
  • 打赏
  • 举报
回复
建议使用现成的类库CSerial类。不必自己去编写通讯代码。
fallenbluefire 2011-02-21
  • 打赏
  • 举报
回复
很抱歉刚刚才来结贴,谢谢大家对我的帮助。
问题已经解决了,正如vcf_reader所述的差不多
我并没有搞懂ReadFile这个函数的实际含义,我认为同步串口通行的方式就是在ReadFile这里堵塞住,直到可以从输入缓冲里面读到数据为止。。
事实上在ReadFile的时候,数据并没有send过来。
修改了两点
1。while循环执行ReadFile
2。open完了以后,加了close
本人不太清楚,串口通信这一块,所以领会问题有一点慢,谢谢大家的指导。
vcf_reader 2011-02-19
  • 打赏
  • 举报
回复
再来补充回答一下。
根据楼主的描述,楼主没有等到EV_RXCHAR的出现。
其实楼主也意识到读之前需要确认一下EV_RXCHAR事件。

这里有个严重的问题,MSDN说得比较明白。其实就是在查询串口状态的时候,数据还没有进来。等到数据进来的时候,这条查询状态的语句已经执行完毕了。这么说不知道楼主明白没有。

如果楼主已经明白我上面说的话,请往下看,否则就没有必要再看下去了。

应该这么做:

1.查询状态
2.若有数据,则读出,否则不读。
3.返回1,继续查询

这个一定要用异步事件的同步化处理方式很好地处理软件,否则就引起死机。
vcf_reader 2011-02-19
  • 打赏
  • 举报
回复
各楼的回答都不对症。

首先,我们要相信楼主不会犯低级错误(如什么连线问题、波特率设置问题)

我认为,就是那条读语句出问题了。

不是说那条语句写错了——这是不会错的。

错在这条语句还需要其他配套的语句来帮助实现。

楼主只是读一下,错这这里了。

应该是这样的:等待串口有数据进来再读。建议楼主好好看看MSDN中关于Serial communication的说明。
欧阳嘉 2011-02-19
  • 打赏
  • 举报
回复
先用串口调试助手试下吧。
比如这个http://www.sudt.com/download/AccessPort134.zip
这个工具收发数据,还可以抓取串口上的收发的数据帧和串口配置时驱动层的IRP消息。

1.确认好发送端和接收端都是COM2,端口插对。
2.确认串口线没有问题,2,3管脚交叉,TX连RX RX连TX
3.两端的波特率,校验位、停止位设置一致。

如果使用串口调试助手能够成功收发的话,再去调试你的程序。

你现在使用的调用方式是同步方式(最后一个参数为NULL)

如果要监听EV_RXCHAR中断消息的话最好使用OVERLAPPED方式,进行异步串口操作。
一条晚起的虫 2011-02-18
  • 打赏
  • 举报
回复
// 9个孔,每个孔对应一个脚位。
// http://www.elecfans.com/article/88/196/2008/200801247510.html
fallenbluefire 2011-02-18
  • 打赏
  • 举报
回复
// 两头电脑要用串口直连的话,必须要一台机器的串口2脚接另一台的串口3脚,5脚相连。
串口2脚是指什么
我的是9孔串口,2脚是串口或者电脑上的什么东东哇
T T本人真是一点概念也无,麻烦大侠在讲一下
一条晚起的虫 2011-02-18
  • 打赏
  • 举报
回复
// 两头电脑要用串口直连的话,必须要一台机器的串口2脚接另一台的串口3脚,5脚相连。
// 即 2-3, 3-2, 5-5,2是接收脚,3是发送脚,5是地线

// 9600是波特率的值,波特率指的是 每秒发送多少个bit
ga6840 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xianglitian 的回复:]

先用串口助手调试一下看看能不能成功
然后再分别在两端用串口助手和你自己的程序对调看能不能调通
然后应该就可以定位问题了
[/Quote]

支持.建议你这样试试
fallenbluefire 2011-02-18
  • 打赏
  • 举报
回复
>首先看看你的串口通信电缆是不是对的,两个电脑串口(公口)相连,串口线中2、3脚要交叉
是什么概念?我那根线的两个头大小是一样的

>一般就是波特率不对
波特率是指9600吗?
向立天 2011-02-18
  • 打赏
  • 举报
回复
先用串口助手调试一下看看能不能成功
然后再分别在两端用串口助手和你自己的程序对调看能不能调通
然后应该就可以定位问题了
  • 打赏
  • 举报
回复
一般就是波特率不对
fishion 2011-02-18
  • 打赏
  • 举报
回复
用sscom32调试下吧
King_hhuang 2011-02-18
  • 打赏
  • 举报
回复
你可以先用串口工具调试一下,如果ok了,再查你程序的问题
King_hhuang 2011-02-18
  • 打赏
  • 举报
回复
首先看看你的串口通信电缆是不是对的,两个电脑串口(公口)相连,串口线中2、3脚要交叉
schlafenhamster 2011-02-18
  • 打赏
  • 举报
回复
232不是多主总线,发送时PC是主,(单主)OK,接受时,2个外设发送是多主,不行的。
用485吧

2,640

社区成员

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

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